還是暢通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 51181 Accepted Submission(s): 23313
當N爲0時,輸入結束,該用例不被處理。
3 5
Hint
Hint
Huge input, scanf is recommended.
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m;
int map[5000];
int pre[5000];
struct node{
int a,b;
int len;
bool operator < (const node & a) const{
return len < a.len;
}
}s[5000];
void init()// 初始化
{
for(int i = 0; i < n*n; i++)
{
pre[i] = i;
}
return;
}
int Find(int a)//查找
{
if(a != pre[a]) return pre[a] = Find(pre[a]);
return a;
}
int Merge(int x, int y)//連接
{
int X = Find(x);
int Y = Find(y);
if(X!=Y)
{
pre[X] = Y;
return 1;
}
return 0;
}
int kruskal()
{
sort(s,s+m);//排序
int ans = 0;
for(int i = 0 ; i < m; i++)
{
if(Find(s[i].a)!=Find(s[i].b))//如果沒有連接
{
ans += s[i].len;//加上最小路徑
Merge(s[i].a , s[i].b);//並且連上
}
}
return ans;//返回最小路徑
}
int main()
{
while(scanf("%d",&n),n)
{
init();
m = n*(n-1)/2;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d",&s[i].a,&s[i].b,&s[i].len);
}
int ans = kruskal();
printf("%d\n",ans);
}
}