“모든 다리를 한 번씩만 건너서 처음 출발했던 장소로 돌아올 수 있는가?”
불가능하다. 정점 별로 연결된 간선의 수가 모두 짝수여야, 간선을 한 번씩만 지나서 처음 출발했던 정점으로 돌아올 수 있다
간선 : 다리
정점 : 다리가 연결하는, 강으로 구분이 되는 땅
정점(vertex) : 연결의 대상이 되는 개체 또는 위치
간선(edge) : 정점들 사이의 연결
정점과 간선을 이용해 표현한 자료구조가 그래프
무방향 그래프(undirected graph)
: 연결 관계에 있어서 방향성이 없는 그래프
방향 그래프(directed graph) 혹은 다이그래프(digraph)
: 간선에 방향정보가 포함된 그래프
완전 그래프
: 각각의 정점에서 다른 모든 정점을 연결한 그래프
방향 그래프의 정점의 수 = 무방향 그래프 정점의 수 x 2
가중치 그래프
: 간선에 가중치 정보를 두어서 구성한 그래프
부분 그래프
: 원 그래프의 일부 정점 및 간선으로 이뤄진 그래프
그래프 G의 정점 집합 : V(G)
그래프 G의 간선 집합 : E(G)
V(G1) = {A, B, C, D} E(G1) = {(A, B), (A, C), (A, D), (B, C), (C, D)}
V(G2) = {A, B, C, D} E(G2) = {(A, C), (A, D), (B, C)}
그래프를 생성 및 초기화 할 때 간선의 방향성 여부를 선택할 수 있고, 가중치의 부여 여부도 선택할 수 있다. 뿐만 아니라, 이후에는 얼마든지 그리고 언제든지 정점과 간선을 삽입하고 삭제할 수 있다
void GraphInit(UALGraph * pg, int hv);
void GraphDestroy(UALGraph *pg);
void AddEdge(UALGraph * pg, int fromV, int toV);
void ShowGraphEdgeInfo(UALGraph * pg);
정점에 이름 부여
enum {A, B, C, D, E, F, G, H, I, J}
" 비상연락망을 보면 내가 지미과 지율에게 연락하는 것으로 되어있네. 우선 지미에게만 연락하자! 연락이 돌다 보면 지율에게도 연락이 갈 테니까"
한 사람에게만 연락한다는 생각
한 길을 깊이 파고드는 것
"나랑 연결된 애들은 다 연락을 받았어. 그러니까 너랑 연결된 애들 중에서 연락 못 받은 애가 있으면 그리로 연락을 줘!"
[DFS의 전체 과정]
- 한 사람에게만 연락을 한다.
- 연락할 사람이 없으면, 자신에게 연락한 사람에게 이를 알린다.
- 처음 연락을 시작한 사람의 위치에서 연락은 끝이 난다.
"한 사람을 기준으로 메시지를 전달하는 사람의 수(폭)"
"동수가 먼저 주변인에게 연락을 취하고, 이어서 민석이 주변인에게 연락을 취한다"
"동수를 떠나서 지민에게 방문할 때, 떠나는 동수의 이름(정보)을 스택으로 옮긴다"
모두에게 연락을 돌리게 되면, 자신에게 연락한 사람의 정보를 스택에서 찾는다.
연락할 대상이 있는 사람을 찾으면 다시 스택으로 옮긴다.
연락을 받은 두 사람의 이름이 큐에 들어가고, 큐에서 이름을 하나 꺼내어 그 이름의 정점에 연결된 모든 사람에게 연결을 취한다.
'명석'의 이름이 큐에 들어가고, '명석'을 꺼내어 '명석'이 연락을 취할 대상이 없는지까지 살펴봐야 한다.
정점 B에서 정점 D에 이르는 경로
단순 경로
: 동일한 간선을 중복하여 포함하지 않는 경로
단순 경로가 아닌 예
사이클
: 단순 경로이면서 시작과 끝이 같은 경로
신장 트리(spanning tree)
: 사이클을 형성하지 않는 그래프
신장 트리의 특징
간선에 방향성이 부여된 방향 그래프를 대상으로도 신장트리를 구성할 수 있다
최소 비용 신장 트리 or 최소 신장 트리
: 간선의 가중치 합이 최소인 그래프
[도로 건설 프로젝트]
강원, 경기, 경북, 울산, 전북을 직선으로 연결하는 물류에 특화된 도로를 건설하려고 한다.
"다섯 개의 지역이 모두 연결되게 하되, 그 거리를 최소화하는 형태로 도로를 건설한다"
크루스칼(Kruskal) 알고리즘
: 가중치를 기준으로 간선을 정렬한 후, MST가 될 때까지 간선을 하나씩 선택하거나 삭제
프림(Prim) 알고리즘
: 하나의 정점을 시작으로 MST가 될 때까지 트리를 확장
가중치가 7인 간선을 추가하면 그래프 내에 사이클이 형성된다
간선의 수 + 1 = 정점의 수
가중치가 8인 간선을 삭제하게 되면 정점 A와 정점 D는 어떠한 경로를 통해서든 닿지 않는다
MST의 모든 정점은 간선에 의해서 하나로 연결되어야 한다