题目描述
修路的方案终于确定了。市政府要求任意两个公园之间都必须实现公路交通(并不一定有直接公路连接,间接公路相连也可以)。但是考虑到经济成本,市政府希望钱花的越少越好。
你能帮助Vegetable找到给出的修路方案所需的最少花费吗?
输入
有T组测试数据。
每组包含一组N(0< n<=100)和M,N表示有N个公园,M表示这N个公园间的M条路。
接下来给出M行,每行包括A,B, C。表示A和B之间修公路需要花费C元。
输出
若给出的方案可行,输出该方案最小需要的花费,若给出的方案不可行,输出Wrong。
样例输入
1
4 3
1 2 1
2 3 2
3 4 3
样例输出
6
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX = 1e6+10;
int pre[MAX];
struct node
{
int u,v;
int value;
}p[MAX];
void init(int n)
{
for(int i=1;i<=n;i++)
{
pre[i]=i;
}
}
bool cmp(node a,node b)
{
return a.value < b.value;
}
int find(int n)
{
if(pre[n]==n)
return n;
else
return pre[n]==find(pre[n]);
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(pre,0,sizeof(pre));
memset(p,0,sizeof(p));
int n,m;
scanf("%d%d",&n,&m);
init(n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
}
sort(p+1,p+m+1,cmp);
int ans=0;
for(int i=1;i<=m;i++)
{
int x=find(p[i].u);
int y=find(p[i].v);
if(x!=y)
{
pre[y]=x;
ans+=p[i].value;
}
}
int flag=1;
for(int i=1;i<=n;i++)
{
if(pre[i]!=pre[1])
{
flag=0;
break;
}
}
if(flag==1)
printf("%d\n",ans);
else
printf("Wrong\n");
}
return 0;
}