HDU 1233----并查集与最小生成树Kru算法
HDU 1233 还是畅通工程
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define MAX 10003
#define M 101
using namespace std;
int father[M];
typedef struct
{
int i,j,k;
}Node;
Node set[MAX];
int cmp(Node a,Node b)
{
return a.k<b.k;
}
int find(int x)
{
if(x!=father[x]) father[x]=find(father[x]);
return father[x];
}
void UnionSet(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y) father[x]=y;
}
int main()
{
int n;
while(scanf("%d",&n)&& n)
{
int total=0;
for(int m=1;m<=n*(n-1)/2;m++)
scanf("%d%d%d",&(set[m].i),&(set[m].j),&(set[m].k));
sort(set,set+n*(n-1)/2+1,cmp);
for(int m=1;m<=n;m++)
{
father[m]=m;
//v[m]=1;
}
int num=n;
for(int m=1;m<=n*(n-1)/2;m++)
{
if(num==1) break;
if(find(set[m].i)!=find(set[m].j))
{
UnionSet(set[m].i,set[m].j);
num--;
total+=set[m].k;
}
}
printf("%d\n",total);
}
return 0;
}
浙公网安备 33010602011771号