B - Networking POJ1287
题意:求最小生成树。输入一个n,k。n表示有n个点,接下来k行,每行输入三个数字a,b,c,意思是:ab之间的距离为c。n=0时结束输入。
#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
#define max 1e5
struct map
{
int a,b,cost;
}p[100000]; //存每条边
int parent[100000]; //连通分量
int m; //边数
bool com(map a,map b)
{
return a.cost<b.cost;
}
int find(int x)
{
while(x!=parent[x])
x=parent[x];
return x;
}
bool Union(int a,int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
{
parent[x]=y;
return true;
}
return false;
}
int main()
{
int n,r,x;
while(~scanf("%d%d",&m,&n))
{
if(m==0) break;
if(n==0)
{
printf("0\n");
continue;
}
for(int i=1;i<=m;i++) //n个顶点分别为自己的连通分量的根结点
{
parent[i]=i; //-1代表自己是这个连通分量的根节点
}
int ans=0;
int i,j,c,k;
for( k=1;k<=n;k++) //输入所有的边
{
scanf("%d%d%d",&i,&j,&c);
p[k].a=i;
p[k].b=j;
p[k].cost=c;
}
// printf("%d\n",num);
sort(p+1,p+k,com);
for(int i=1;i<k;i++)
{
if(Union(p[i].a,p[i].b))
{
ans+=p[i].cost;
// printf("%da%da\n",i,p[i].cost);
}
}
printf("%d\n",ans);
}
return 0;
}