Koder / 박성훈
article thumbnail

프림 / 크루스칼 알고리즘을 사용하면 쉽게 해결할 수 있다.

나는 크루스칼 알고리즘을 사용했다.

 

www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

크루스칼 알고리즘의 기본적인 구현을 묻는 문제

 

더보기
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;

struct line{
	int s;
	int e;
	int w;
};

vector<line> g;

int parent[12345] = {0};

bool cmp(line a, line b){
	return a.w < b.w;
}

int find(int node){
	if(parent[node] == node) return node;
	return parent[node] = find(parent[node]);
}

void unionf(int a, int b){
	a = find(a);
	b = find(b);
	if(a!=b) parent[a] = b;
	return;
}


int main(){
	int v,e;
	int a,b,c;
	ll ans = 0;
	scanf("%d %d", &v, &e);
	
	for(int i=0; i<e; i++){
		scanf("%d %d %d", &a, &b, &c);
		g.push_back({a,b,c});
	}
	
	sort(g.begin(), g.end(), cmp);
	for(int i=0; i<12345; i++) parent[i] = i;
	
	for(int i=0; i<g.size(); i++){
		if(find(g[i].s) != find(g[i].e)){
			ans += g[i].w;
			unionf(g[i].s, g[i].e);
		}
	}
	
	printf("%lld", ans);
	return 0;
}

깔끔하게 AC받았다.

 

반응형