还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 19368 Accepted Submission(s): 8608
当N为0时,输入结束,该用例不被处理。
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
3 5Huge input, scanf is recommended.HintHint
#include <iostream>
#include <cstdlib>
using namespace std;
int father[111],k;
struct ssss
{
int a,b,c;
}ss[5555]; //路线数
int cmp(const void *a,const void *b) //按长度从小到大快排
{
return (*(ssss *)a).c-(*(ssss *)b).c;
}
int Find(int a) //找到a所在家族的祖先并路径上成员指向祖先
{
return a==father[a]?a:father[a]=Find(father[a]);
}
void Union(int a,int b,int i)
{
if(Find(a)!=Find(b))
{
father[Find(a)]=Find(b);k+=ss[i].c; //并入家族且把长度加上来
}
}
int main (void)
{
int n,m,i;
while(scanf("%d",&n)!=EOF&&n)
{
m=n*(n-1)/2;
for(i=1;i<=n;i++)father[i]=i;
for(i=0;i<m;i++)
scanf("%d%d%d",&ss[i].a,&ss[i].b,&ss[i].c);
qsort(ss,m,sizeof(ss[0]),cmp);
for(i=k=0;i<m;i++)
Union(ss[i].a,ss[i].b,i);
printf("%d\n",k);
}
return 0;
}