模板总结归纳:
//Kruskal
//O(MlogM)
//POJ 2395 HDU 1863 畅通工程
/*struct edge
{
int x, y, w;
}e[MaxN];
int find(int x)
{
return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int kruscal()
{
sort(e + 1, e + 1 + M, cmp);
int cnt = N;
for(int i = 1; i <= N; i++) fa[i] = i;
for(int i = 1; i <= M; i++)
{
int t1 = find(e[i].x);
int t2 = find(e[i].y);
if(t1 != t2)
{
fa[t1] = t2;
ans += e[i].w;
cnt--;
if(cnt == 1) break;
}
}
return ans;
}*/
实战模板题 :HDU 1863 畅通工程
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MaxN = 110;
int fa[MaxN], N, M, cnt;
struct edge{
int x, y, w;
}e[MaxN];
bool cmp(struct edge a, struct edge b)
{
return a.w < b.w;
}
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
int kruscal()
{
sort(e + 1, e + 1 + M, cmp);
cnt = N;
int ans = 0;
for(int i = 1; i <= N; i++) fa[i] = i;
for(int i = 1; i <= M; i++)
{
int t1 = find(e[i].x);
int t2 = find(e[i].y);
if(t1 != t2)
{
fa[t1] = t2;
ans += e[i].w;
cnt--;
if(cnt == 1) break;
}
}
return ans;
}
int main()
{
while(cin >> M >> N)
{
if(M == 0) break;
for(int i = 1; i <= M; i++)
{
cin >> e[i].x >> e[i].y >> e[i].w;
}
int ans = kruscal();
if(cnt == 1)
cout << ans << endl;
else
cout << "?" << endl;
}
return 0;
}