题目背景
奶牛爱干草
题目描述
Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发。农场之间总共有M (1 <= M <= 10,000)条双向道路,所有道路的总长度不超过1,000,000,000。有些农场之间存在着多条道路,所有的农场之间都是连通的。
Bessie希望计算出该图中最小生成树中的最长边的长度。
输入格式
两个整数N和M。
接下来M行,每行三个用空格隔开的整数A_i, B_i和L_i,表示A_i和 B_i之间有一条道路长度为L_i。
输出格式
一个整数,表示最小生成树中的最长边的长度。
输入输出样例
输入 #1
3 3 1 2 23 2 3 1000 1 3 43
输出 #1
43
再来一道Kruskal
用一个while循环,判断如果有两条边是不连通的,就将它们进行合并,并且判断是不是最大的。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int n,m,i,ans,p[20005],f; struct pt{ int pnt1; int pnt2; int length; } a[200100]; bool cmp(pt x, pt y){ return x.length<y.length; } int ch(int x){ if(p[x]==x){ return p[x]; } p[x]=ch(p[x]); return p[x]; } int main(){ scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ cin>>a[i].pnt1>>a[i].pnt2>>a[i].length; } for(i=1;i<=n;i++){ p[i]=i; } sort(a+1,a+m+1,cmp); i=0; while(f<n-1){ i++; if (ch(a[i].pnt1)!=ch(a[i].pnt2)){ p[ch(a[i].pnt1)]=ch(a[i].pnt2); if (ans<a[i].length){ ans=a[i].length; } f++; } } printf("%d",ans); }