Definition

spanning tree of that has the least cost

Greedy algorithm

  1. 로컬한 정보로 상태를 바꿀 수 있어야 하고
  2. 백트래킹이 없어야 함 (로컬하게 부분 만든 게 나중에 바뀌면 안됨)

Kruskal’s algorithm

E에 엣지 전부 집어넣고 weight 제일 낮은 edge 뺌

그 edge가 사이클을 만들면 버리고 아니면 T에 넣음

T = ∅;
while((T contains less than n − 1 edges) && ((E ≠ ∅)) {
	choose a least cost edge (v, w) from E;
	delete (v, w) from E;
	if((v, w) does not create a cycle in T)
		add (v, w) to T;
	else
		discard (v, w);
}
if(T contains fewer than n − 1 edges)
	printf("no spanning tree\\n");

Time complexity

min heap 생성 : O(e * log e)

disjoint set trees 조작 : find O(log n) union O(1)O(e log n)

e는 n으로 표현 가능. O(e log n)

Prim’s algorithm

아무 vertex를 시작점으로 잡음

TV에 속하는 vertex와 adjacent한 edge 중 cost가 제일 낮은 vertex를 추가

/* Assume that G has at least one vertex */
TV = {0}; /* start with vertex 0 and no edges */
for(T = ∅; T contains less than n − 1 edges; add (u, v) to T) {
	let (u, v) be a least-cost edge such that u ∈ TV and v ∉ TV;
	if (there is no such edge)
		break;
	add v to TV;
}
if (T contains fewer than n − 1 edges)
	printf("no spanning tree\\n");

Time complexity

O(e log n)

generic graph traverse algorithm이 O(n + e * t)인 거에서 bag만 힙으로 바뀐 거임! (t → log n)