题目描述
有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
输入
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
输出
每组输出占一行,仅输出最小花费。
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
2 0
代码:
#include <string.h> #include <stdlib.h> #include <stdio.h> int bin[110]; int sum; int num; //声明全局变量
struct node//创建结构体 { int u,v,w;//存储边的信息 }q[100000],t; int finds(int a)//查找根结点+路径压缩 { if(a!=bin[a]) a=finds(bin[a]); return a; } int main() { int n,m; int i,j; int a,b,c;//声明变量 while(~scanf("%d %d",&n,&m))//循环输入数据n和m的值 { sum=0;//存储权值 num=0;//存储边数 for(i=1;i<=n;i++) bin[i]=i; //初始化 for(i=0;i<m;i++) { scanf("%d %d %d",&q[i].u,&q[i].v,&q[i].w); } for(i=0;i<m-1;i++) for(j=i+1;j<m;j++) { if(q[i].w>q[j].w) { t=q[i]; q[i]=q[j]; q[j]=t; } } for(i=0;i<m;i++) { int x=finds(q[i].u); int y=finds(q[i].v); if(x!=y) { sum+=q[i].w;//记录权值之和 bin[y]=q[i].u;//合并 num++;//边数加1 } if(num==n-1)//最小生成树条件:边数=顶点数-1 { break; } } printf("%d\n",sum); } return 0; }