그래프 (자료 구조) - 위키백과, 우리 모두의 백과사전
그래프 자료구조는 크게 리스트와 행렬로 구현할 수 있다. 이 페이지에서는 행렬 중 인접행렬(Adjacency Matrix)로 그래프를 구현하는 것에 대해 다룬다.
import sys
I = sys.stdin.readline
node, edge = map(int, I().split())
adj = [[0 for _ in range(node)] for _ in range(node)]
for _ in range(edge):
src, dest = map(int, I().split())
adj[src][dest] = 1
adj[dest][src] = 1
print(*adj, sep='\\n')
5 1
1 2
[0, 0, 0, 0, 0]
[0, 0, 1, 0, 0]
[0, 1, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
def input_adjmatrix(filename):
with open(filename, "r") as file:
node, edge = map(int, file.readline().split())
adj = [[0 for _ in range(node)] for _ in range(node)]
for line in file:
a, b = map(int, line.split())
adj[a][b] = 1
adj[b][a] = 1
return adj
graph = input_adjmatrix("Graph Theory\\Adj Matrix\\graph_sample.txt")
print("adjmatrix : ", *graph, sep='\\n')
adjmatrix :
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 1, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
#include <stdio.h>
#include <stdlib.h>
int** input_adjmatrix(char* filename, int* vertex, int* edge) {
FILE* fp = fopen(filename, "rt");
if (!fp) {
printf("-- FILE NOT FOUND --\\n");
return NULL;
}
int i, a, b;
fscanf(fp, "%d %d", vertex, edge);
int** adj = (int**)calloc(*vertex, sizeof(int*));
for (i = 0; i < *vertex; i++) {
adj[i] = (int*)calloc(*vertex, sizeof(int));
}
for (i = 0; i < *edge; i++) {
fscanf(fp, "%d %d", &a, &b);
adj[a][b] = 1;
adj[b][a] = 1;
}
return adj;
}
int main() {
int v, e;
int** graph = input_adjmatrix("graph_sample.txt", &v, &e);
if (!graph) return 0;
int i, j;
for (i = 0; i < v; i++) {
for (j = 0; j < v; j++) {
printf("%d ", graph[i][j]);
}
printf("\\n");
}
return 0;
}
C++파일입출력을 복습한다는 느낌으로 작성하였다.
#include <cstring>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int** input_adjmatrix(string filename, int& vertex, int& edge) {
ifstream fin(filename);
if (fin.fail()) {
cerr << "FILE NOT FOUND\\n";
return nullptr;
}
fin >> vertex >> edge;
int** adj = new int*[vertex];
for (int i = 0; i < vertex; i++) {
adj[i] = new int[vertex];
memset(adj[i], 0, vertex * sizeof(int));
}
int a, b;
while (!fin.eof()) {
fin >> a >> b;
adj[a][b] = 1;
adj[b][a] = 1;
}
fin.close();
return adj;
}
int main() {
int vertex, edge;
int** graph = input_adjmatrix("graph_sample.txt", vertex, edge);
for (int i = 0; i < vertex; i++) {
for (int j = 0; j < vertex; j++) {
cout << graph[i][j] << ' ';
}
cout << '\\n';
}
}