Kruskal基础最小生成树
http://acm.hdu.edu.cn/showproblem.php?pid=1863
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int f[105];
typedef struct
{
int x,y,w;
}Edge;
Edge edge[5000];
int find(int x)
{
if(f[x]!=x)
f[x]=find(f[x]);
return f[x];
}
int cmp(Edge a,Edge b)
{
return a.w<b.w?1:0;
}
int kruskal(int x)
{
int sum=0;
for(int i=1;i<=x;i++)
{
int f1=find(edge[i].x);
int f2=find(edge[i].y);
if(f1!=f2)
{
f[f1]=f2;
sum+=edge[i].w;
}
}
return sum;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0) break;
for(int i=1;i<=m;i++)
f[i]=i;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].w);
sort(edge+1,edge+n+1,cmp);
int ans=kruskal(n);
int cnt=0;
for(int i=1;i<=m;i++)
if(f[i]==i)
cnt++;
if(cnt>1)
printf("?\n");
else
printf("%d\n",ans);
}
return 0;
}