- Prim

-
 시작 정점에서부터 출발하여 신장 트리 집합을 단계적으로 확장해나가는 방법, 정점 선택 기반

- 시작 단계에서는 시작 정점만이 신장 트리 집합에 포함

- 앞 단계에서 만들어진 신장 트리 집합에 인접한 정점들 중에서 최소 간선으로 연결된 정점을 선택하여 트리를 확장

- 시간복잡도 

 => 희박한 그래프를 대상으로 할 경우에는 크루스칼의 알고리즘이 적합, 밀집한 그래프의 경우에는 프림 알고리즘이 유리

'Algorithm' 카테고리의 다른 글

알고리즘 - 플로이드  (0) 2015.11.14
알고리즘 - 다익스트라  (0) 2015.11.14
알고리즘 - 크루스칼  (0) 2015.11.13
알고리즘 - 너비 우선 탐색  (0) 2015.11.13
알고리즘 - 깊이 우선 탐색  (0) 2015.11.13

- Kruskal

- 탐욕적인 방법(greedy method), 간선 선택 기반  

- 간선들을 가중치의 오름차순으로 정렬, 사이클을 형성하지 않는 간선을 찾아서 현재의 최소 비용 신장 트리의 집합에 추가

- 시간복잡도 


- union-find 연산 (사이클, 집합)


  

#define MAX_VERTECS 100

int parent[MAX_VERTECS]; // 부모 노드
int num[MAX_VERTECS]; // 각 집합의 크기

// 초기화
void set_init(int n)
{
	int i;
	for(i=0; i<n; i++) {
		parent[i] = -1;
		num[i] = 1;
} } // vertext가 속하는 집합을 반환한다. int set_find(int vertex) { int p, s, i = -1; for(i = vertex; (p=parent[i])>=0; i=p) // 루트 노드까지 반복 ; s = i; // 집합의 대표 원소(최상위 부모노드) for(i = vertex; (p=parent[i])>=0; i=p) parent[i] = s; // 집합의 모든 원소들의 부모를 s로 설정 return s; } // 두 개의 원소가 속한 집합을 합친다. void set_union(int s1, int s2) { // 연산량을 줄이기 위해 정점의 개수가 적은 트리의 루트가 큰 트리의 루트를 가리키도록 함 if(num[s1] < num[s2]) { parent[s1] = s2; num[s2] += num[s1]; } else { parent[s2] = s1; num[s1] += num[s2]; } }


'Algorithm' 카테고리의 다른 글

알고리즘 - 다익스트라  (0) 2015.11.14
알고리즘 - 프림  (0) 2015.11.13
알고리즘 - 너비 우선 탐색  (0) 2015.11.13
알고리즘 - 깊이 우선 탐색  (0) 2015.11.13
알고리즘 - 정렬 알고리즘 비교  (2) 2015.11.12

- spanning tree

- 그래프 내의 모든 정점을 포함하는 트리

- 트리의 특수한 형태로 모든 정점들이 연결되어 있어야 하고 사이클을 포함해서는 안된다, n개의 정점을 정확히 (n-1)개의 간선으로 연결

- 깊이 우선 탐색이나 너비 우선 탐색 도중에 사용된 간선만 모으면 만들 수 있다.

- 최소 신장 트리 (MST, Minimum spanning tree)
   : 모든 정점들을 가장 적은 수의 간선과 비용으로 연결하는 트리
   : 도리 건설, 전기 회로, 통신, 배관 등에 이용

'Major > Data structures' 카테고리의 다른 글

자료구조 - 해싱  (0) 2015.11.14
자료구조 - 그래프  (0) 2015.11.13
자료구조 - 우선순위큐(힙)  (0) 2015.11.12
자료구조 - 이진트리  (0) 2015.11.12
자료구조 - 트리  (0) 2015.11.12

+ Recent posts