๊ทธ๋ํ ๊ฐ๋
2021.12.21 - [๐ ์๋ฃ๊ตฌ์กฐ ๋ฐ ์๊ณ ๋ฆฌ์ฆ/๊ทธ๋ํ] - ๊ทธ๋ํ(Graph)๋?
๊ทธ๋ํ(Graph)๋?
๊ทธ๋ํ๋ ์ฐ๊ฒฐ๋์ด ์๋ ์์ ์ฌ์ด์ ๋ค๋๋ค ๊ด๊ณ๋ฅผ ํํํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ๊ทธ๋ํG๋ ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ์ ์ V(vertex)์ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ E(edge)์ ์งํฉ์ด๋ค. ํธ๋ฆฌ๋ ๊ทธ๋ํ์ ํ ์ข ๋ฅ์ด๋ฉฐ,
linerate.tistory.com
์ ๋งํฌ ์ฐธ์กฐ
๊ทธ๋ํ ADT
โช create_graph() ::= ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ค.
โช init(g) ::= ๊ทธ๋ํ g๋ฅผ ์ด๊ธฐํํ๋ค.
โช insert_vertex(g,v) ::= ๊ทธ๋ํ g์ ์ ์ v๋ฅผ ์ฝ์ ํ๋ค.
โช insert_edge(g,u,v) ::= ๊ทธ๋ํ g์ ๊ฐ์ (u,v)๋ฅผ ์ฝ์ ํ๋ค.
โช delete_vertex(g,v) ::= ๊ทธ๋ํ g์ ์ ์ v๋ฅผ ์ญ์ ํ๋ค.
โช delete_edge(g,u,v) ::= ๊ทธ๋ํ g์ ๊ฐ์ (u,v)๋ฅผ ์ญ์ ํ๋ค.
โช is_empty(g) ::= ๊ทธ๋ํ g๊ฐ ๊ณต๋ฐฑ ์ํ์ธ์ง ํ์ธํ๋ค.
โช adjacent(v) ::= ์ ์ v์ ์ธ์ ํ ์ ์ ๋ค์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
โช destroy_graph(g) ::= ๊ทธ๋ํ g๋ฅผ ์ ๊ฑฐํ๋ค.
๊ทธ๋ํ์ ํํ ๋ฐฉ๋ฒ 2๊ฐ์ง
1. ์ธ์ ํ๋ ฌ (adjacent matrix) ๋ฐฉ๋ฒ
if(๊ฐ์ (i, j)๊ฐ ๊ทธ๋ํ์ ์กด์ฌ) M[i][j] = 1, ๊ทธ๋ ์ง์์ผ๋ฉด M[i][j] = 0

#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 50
typedef struct GraphType {
int n; // ์ ์ ์ ๊ฐ์
int adj_mat[MAX_VERTICES][MAX_VERTICES];
} GraphType;
// ๊ทธ๋ํ ์ด๊ธฐํ
void init(GraphType* g)
{
int r, c;
g->n = 0;
for (r = 0; r<MAX_VERTICES; r++)
for (c = 0; c<MAX_VERTICES; c++)
g->adj_mat[r][c] = 0;
}
// ์ ์ ์ฝ์
์ฐ์ฐ
void insert_vertex(GraphType* g, int v)
{
if (((g->n) + 1) > MAX_VERTICES) {
fprintf(stderr, "๊ทธ๋ํ: ์ ์ ์ ๊ฐ์ ์ด๊ณผ");
return;
}
g->n++;
}
// ๊ฐ์ ์ฝ์
์ฐ์ฐ
void insert_edge(GraphType* g, int start, int end)
{
if (start >= g->n || end >= g->n) {
fprintf(stderr, "๊ทธ๋ํ: ์ ์ ๋ฒํธ ์ค๋ฅ");
return;
}
g->adj_mat[start][end] = 1;
g->adj_mat[end][start] = 1;
}
//์ธ์ ํ๋ ฌ ์ถ๋ ฅ ํจ์
void print_adj_mat(GraphType* g) {
for (int i = 0; i < g->n; i++) {
for (int j = 0; j < g->n; j++) {
printf("%2d", g->adj_mat[i][j]);
}
printf("\n");
}
}
int main(void)
{
GraphType *g;
g = (GraphType *)malloc(sizeof(GraphType));
init(g);
for(int i=0;i<4;i++)
insert_vertex(g, i);
insert_edge(g, 0, 1);
insert_edge(g, 0, 2);
insert_edge(g, 0, 3);
insert_edge(g, 1, 2);
insert_edge(g, 2, 3);
print_adj_mat(g);
free(g);
return 0;
}
2. ์ธ์ ๋ฆฌ์คํธ(adjacent list) ๋ฐฉ๋ฒ
๊ฐ ์ ์ ์ ์ธ์ ํ ์ ์ ๋ค์ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ก ํํ

#include <stdio.h>
#pragma warning(disable:4996)
#define MAX_VERTICES 50
typedef struct GraphNode {
int vertex;
struct GraphNode* link;
}GraphNode;
typedef struct GraphType {
int n;
GraphNode* adj_list[MAX_VERTICES];
}GraphType;
//๊ทธ๋ํ ์ด๊ธฐํ
void init(GraphType* g) {
int v;
g->n = 0;
for (v = 0; v < MAX_VERTICES; v++) {
g->adj_list[v] = NULL;
}
}
//์ ์ ์ฝ์
์ฐ์ฐ
void insert_vertex(GraphType* g, int v) {
if (((g->n) + 1) > MAX_VERTICES) {
fprintf(stderr, "๊ทธ๋ํ: ์ ์ ์ ๊ฐ์ ์ด๊ณผ");
return;
}
g->n++;
}
//๊ฐ์ ์ฝ์
์ฐ์ฐ, v๋ฅผ u์ ์ธ์ ๋ฆฌ์คํธ์ ์ฝ์
void insert_edge(GraphType* g, int u, int v) {
GraphNode* node;
if (u >= g->n || v >= g->n) {
fprintf(stderr, "๊ทธ๋ํ: ์ ์ ๋ฒํธ ์ค๋ฅ");
return;
}
node = (GraphNode*)malloc(sizeof(GraphNode));
node->vertex = v;
node->link = g->adj_list[u];//์ฐ๊ฒฐ๋ฆฌ์คํธ์ ๋งจ ์ฒ์์ ์ฝ์
g->adj_list[u] = node;
}
void print_adj_list(GraphType* g) {
for (int i = 0; i < g->n; i++) {
GraphNode* p = g->adj_list[i];
printf("์ ์ %d์ ์ธ์ ๋ฆฌ์คํธ", i);
while (p != NULL) {
printf("-> %d", p->vertex);
p = p->link;
}
printf("\n");
}
}
int main() {
GraphType* g;
g = (GraphType*)malloc(sizeof(GraphType));
init(g);
for (int i = 0; i < 4; i++) {
insert_vertex(g, i);
}
insert_edge(g, 0, 1);
insert_edge(g, 1, 0);
insert_edge(g, 0, 2);
insert_edge(g, 2, 0);
insert_edge(g, 0, 3);
insert_edge(g, 3, 0);
insert_edge(g, 1, 2);
insert_edge(g, 2, 1);
insert_edge(g, 2, 3);
insert_edge(g, 3, 2);
print_adj_list(g);
free(g);
}