[πŸ“—cμ–Έμ–΄ μ‰½κ²Œ ν’€μ–΄μ“΄ 자료ꡬ쑰10] κ·Έλž˜ν”„

μ•ˆμ§€μˆ˜Β·2023λ…„ 2μ›” 13일
0

πŸ‘‘ κ·Έλž˜ν”„μ˜ μš©μ–΄μ™€ κ°œλ…

: 객체 μ‚¬μ΄μ˜ 연결관계λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” 자료ꡬ쑰 (정점과 κ°„μ„ λ“€μ˜ μœ ν•œμ§‘ν•©)

  • 정점 (Vertex,λ…Έλ“œ): 각 λ…Έλ“œ
  • κ°„μ„  (edge,링크): 정점듀 κ°„μ˜ 관계
  • 인접정점: 간선에 μ˜ν•΄ 직접 μ—°κ²°λœ 정점
  • 차수: 무방ν–₯ κ·Έλž˜ν”„μ—μ„œ 정점에 μΈμ ‘ν•œ μ •μ μ˜ 수
  • 경둜: μ •μ μ˜ λ‚˜μ—΄ (정점 κ°„μ—λŠ” λ°˜λ“œμ‹œ 간선이 μ‘΄μž¬ν•΄μ•Ό 함)
  • λ‹¨μˆœκ²½λ‘œ: λ°˜λ³΅λ˜λŠ” 간선이 μ—†λŠ” 경둜
  • 싸이클: λ‹¨μˆœκ²½λ‘œμ—μ„œ μ‹œμž‘μ •μ κ³Ό μ’…λ£Œμ •μ μ΄ 같은 경둜

& κ·Έλž˜ν”„μ˜ μ’…λ₯˜

  1. 무방ν–₯ κ·Έλž˜ν”„: μ–‘λ°©ν–₯으둜 갈 수 있음 (A, B)
  2. λ°©ν–₯ κ·Έλž˜ν”„: 간선에 λ°©ν–₯성이 쑴재 <A, B>
  3. λ„€νŠΈμ›Œν¬ (κ°€μ€‘μΉ˜ κ·Έλž˜ν”„): 간선에 κ°€μ€‘μΉ˜κ°€ ν• λ‹Ήλœ κ·Έλž˜ν”„
  4. λΆ€λΆ„ κ·Έλž˜ν”„: μ •μ μ˜ 일뢀와 κ°„μ„ μ˜ μΌλΆ€λ‘œ 이루어진 κ·Έλž˜ν”„
  5. μ—°κ²° κ·Έλž˜ν”„: λͺ¨λ“  정점 μŒμ— λŒ€ν•˜μ—¬ 항상 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ” λ°©ν–₯κ·Έλž˜ν”„
    (νŠΈλ¦¬λŠ” 싸이클을 가지지 μ•ŠλŠ” μ—°κ²° κ·Έλž˜ν”„μž„)
  6. μ™„μ „ κ·Έλž˜ν”„: λͺ¨λ“  정점이 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” κ·Έλž˜ν”„
    (μ™„μ „ κ·Έλž˜ν”„μ˜ κ°„μ„ μ˜ 수: n(n-1)/2)

πŸ‘‘ κ·Έλž˜ν”„μ˜ ν‘œν˜„ 방법과 κ΅¬ν˜„

  1. 인접 ν–‰λ ¬: κ°„μ„ μ˜ μˆ˜κ°€ λ§Žμ„ 경우 적합 (밀집 κ·Έλž˜ν”„)
  • λŒ€κ°μ„  성뢄은 λͺ¨λ‘ 0 (자체 κ°„μ„  ν—ˆμš©ν•˜μ§€ μ•ŠμŒ)
  • 무방ν–₯ κ·Έλž˜ν”„μ˜ 인접행렬: λŒ€μΉ­ ν–‰λ ¬
  • 정점 i의 차수: ν–‰λ ¬μ˜ μ—΄μ΄λ‚˜ ν–‰μ˜ 값을 λͺ¨λ‘ λ”ν•˜μ—¬
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 50
typedef struct GraphType {
	int n;
	int adj_mat[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");
	}
}
  1. 인접 리슀트: κ°„μ„ μ˜ μˆ˜κ°€ λ³„λ‘œ 없을 경우 적합 (ν¬μ†Œκ·Έλž˜ν”„)
#include <stdio.h>
#include <stdlib.h>
#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++;
}

//κ°„μ„  μ‚½μž… μ—°μ‚°
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");
	}
}

πŸ‘‘ κ·Έλž˜ν”„μ˜ 탐색1 (깊이 μš°μ„  탐색- μŠ€νƒ)

  1. 인접 ν–‰λ ¬
  2. 인접 리슀트

πŸ‘‘ κ·Έλž˜ν”„μ˜ 탐색2 (λ„ˆλΉ„ μš°μ„  탐색- 큐)

: 거리가 κ°€κΉŒμš΄ μ •μ μ˜ μˆœμ„œλ‘œ 탐색이 진행
1. 인접행렬
2. 인접 리슀트

profile
μ§€μˆ˜μ˜ μ·¨μ€€, 개발일기

0개의 λŒ“κΈ€