题目背景
奶牛爱干草
题目描述
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
并查集
意思就是说,开始的每个点都是独立的集合,加边的时候就合并起来,如果已经是联通的就跳过。
#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; } inline int read(){ int s=0,w=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-'){ w=-1; } ch=getchar(); } while(ch>='0'&&ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*w; } 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++){ a[i].pnt1=read(); a[i].pnt2=read(); a[i].length=read(); } 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); }