[์ž๋ฃŒ๊ตฌ์กฐ] ๊ทธ๋ž˜ํ”„(Graph) ๊ตฌํ˜„ํ•˜๊ธฐ

2022. 12. 16. 00:16ยท๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„
728x90

๊ทธ๋ž˜ํ”„ ๊ฐœ๋…

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);
}
728x90
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๊ทธ๋ž˜ํ”„' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(Minimum spanning tree)๋ž€?
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ BFS(Breadth First Search)๋ž€?
  • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ DFS(Depth First Search)๋ž€?
  • ๊ทธ๋ž˜ํ”„(Graph)๋ž€?
juno1105
juno1105
๊ณต๋ถ€ํ•˜๋Š” ๊ฒธ ํฌํด ๋ธ”๋กœ๊ทธ
  • juno1105
    @juno1105
    juno1105
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (89)
      • ๐Ÿ’ฌ ์ž์œ  (3)
      • ๐Ÿ“– ์–ดํ•™ ๊ณต๋ถ€ (0)
      • ๐Ÿ“” ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ (4)
      • ๐Ÿ›  ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๋ฒ• (1)
      • ๐Ÿ“š ์ž๋ฃŒ๊ตฌ์กฐ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (53)
        • ์Šคํƒ (4)
        • ํ (4)
        • ์ •๋ ฌ ๋ฐ ํƒ์ƒ‰ (17)
        • ๋ฆฌ์ŠคํŠธ (5)
        • ํ•ด์‹œ (1)
        • ํŠธ๋ฆฌ (8)
        • ํž™ (2)
        • ๊ทธ๋ž˜ํ”„ (12)
      • ๐Ÿ’ป ์ปดํ“จํ„ฐ ๊ตฌ์กฐ (0)
      • ๐Ÿšฅ ๋…ผ๋ฆฌํšŒ๋กœ (8)
      • ๐Ÿ”ฐ ๋ฐฑ์ค€ (20)
        • ํ, ์Šคํƒ, ๋ฑ (0)
        • DFS ์™€ BFS (3)
        • ๊ทธ๋ฆฌ๋”” (0)
        • ๋™์ ๊ณ„ํš๋ฒ• 1 (16)
        • ๋™์ ๊ณ„ํš๋ฒ• 2 (0)
        • ์ตœ๋‹จ ๊ฒฝ๋กœ (0)
        • ํŠธ๋ฆฌ (0)
        • ๋ฐฑํŠธ๋ž˜ํ‚น (0)
        • ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ (0)
        • ์ง‘ํ•ฉ๊ณผ ๋งต (1)
      • ๐ŸŒˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (0)
      • ๐Ÿ“ฑ ์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • โœจ์ž๋ฃŒ๊ตฌ์กฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ปค๋ฆฌํ˜๋Ÿผโœจ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ํ† ์ต 900
    ํ† ์ต
    ์ •๋ ฌ
    ํ† ์ต 900์ 
    ๊ทธ๋ž˜ํ”„ํƒ์ƒ‰
    ํ† ์ต 910์ 
    ํ† ์ต 950์ 
    ํ† ์ต 900์ ๋Œ€
    ํ† ์ต 920์ 
    ๋น…์˜คํ‘œ๊ธฐ๋ฒ•
    ์ •๋ ฌ ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    ์ •๋ ฌ ์ตœ์•…์˜ ๊ฒฝ์šฐ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ์ตœ๋‹จ๊ฒฝ๋กœ
    ์‹œ๊ฐ„๋ณต์žก๋„
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
juno1105
[์ž๋ฃŒ๊ตฌ์กฐ] ๊ทธ๋ž˜ํ”„(Graph) ๊ตฌํ˜„ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”