본문 바로가기
알고리즘/메모

최소 스패닝 트리

by sun__ 2019. 8. 18.

크루스칼 O(ElogE)

 

필요한 것:

 union-find (merge 병합성공여부 반환)

 간선구조체 - 가중치 기준으로 오름차순 정렬하기 위함.

 

int uf[100001];

int find(int a) {
	if (uf[a] < 0) return a;
	return uf[a] = find(uf[a]);
}

bool merge(int a, int b) {
	a = find(a);
	b = find(b);
	if (a == b) return false;
	uf[a] = b;
	return true;
}

struct Edge {
	int u, v, w;
	Edge(int u1, int v1, int w1) : u(u1), v(v1), w(w1) {}
	bool operator < (const Edge& O) const { return w < O.w; }
};

int main() {
	int n, m;
	Edge e[1000000];
	fill(uf, uf + n, -1);
	sort(e, e + m); //가중치 기준 정렬

	int rst = 0, cnt = 0;
    //"MST 뽑기"
	for (int i = 0; ; i++) {
		if (merge(e[i].u, e[i].v)) { //양 끝점이 연결 돼있지 않은 간선에 대해서만
			rst += e[i].w;
			if (++cnt == n - 1) break; //n-1개의 간선을 뽑으면 종료
		}
	}

	cout << rst << '\n';
}

 

<+>

모든 간선을 힙에다 넣고 빼주는 '프림' 알고리즘도 O(ElogE)

'알고리즘 > 메모' 카테고리의 다른 글

강한 연결 요소(SCC)  (0) 2019.08.19
위상정렬, DAG(Directed Acyclic Graph)  (0) 2019.08.18
플로이드 와샬  (0) 2019.08.18
벨만포드, SPFA  (0) 2019.08.18
다익스트라  (0) 2019.08.18