修路的方案终于确定了。市政府要求任意两个公园之间都必须实现公路交通(并不一定有直接公路连接,间接公路相连也可以)。但是考虑到经济成本,市政府希望钱花的越少越好。
你能帮助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
//kruscal 算法
#include<iostream> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; const int MAX=110; const int INF=0x3f3f3f3f; int pre[MAX]; struct map { int a,b; int c; }N[MAX]; void init(int n) { for(int i=1;i<=n;i++) pre[i]=i; } bool cmp(map a,map b) { return a.c<b.c; } int find(int x) { int r=x; while(r!=pre[r]) r=pre[r]; int i=x,j; while(i!=r) { j=pre[i]; pre[i]=r; i=j; } return r; } int join(int a,int b) { int x=find(a),y=find(b); if(x!=y) { pre[x]=y; return 1; } else return 0; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d%d",&n,&m); init(n); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); N[i].a=a;N[i].b=b;N[i].c=c; } sort(N+1,N+1+m,cmp); int sum=0,cnt=0; for(int i=1;i<=m;i++) { if(join(N[i].a,N[i].b)==1) { sum+=N[i].c; } } for(int i=1;i<=n;i++) { if(i==pre[i]) cnt++; } if(cnt==1) printf("%d\n",sum); else printf("Wrong\n"); } return 0; }