P1547 Out of Hay
题目描述
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 <bits/stdc++.h> using namespace std; typedef long long ll; #define inf 2147483647 const ll INF = 0x3f3f3f3f3f3f3f3fll; #define ri register int template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); } template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); } template <class T> inline T min(T a, T b, T c, T d) { return min(min(a, b), min(c, d)); } template <class T> inline T max(T a, T b, T c, T d) { return max(max(a, b), max(c, d)); } #define pi acos(-1) #define me(x, y) memset(x, y, sizeof(x)); #define For(i, a, b) for (int i = a; i <= b; i++) #define FFor(i, a, b) for (int i = a; i >= b; i--) #define mp make_pair #define pb push_back const int maxn = 100005; #define mod 100003 const int N=500000; // name******************************* struct edge { int from,to,dis; } e[N]; int pre[N]; int Rank[N]; int n,m; int ans; // function****************************** void init(int x) { pre[x]=-1; Rank[x]=0; } int find(int x) { int t=x; while(pre[t]!=-1)t=pre[t]; while(x!=t) { int k=pre[x]; pre[x]=t; x=k; } return t; } void unionone(int a,int b) { int t1=find(a); int t2=find(b); if(Rank[t1]>Rank[t2]) pre[t2]=t1; else pre[t1]=t2; if(Rank[t1]==Rank[t2]) Rank[t2]++; } bool cmp(edge x,edge y) { return x.dis<y.dis; } //*************************************** int main() { // freopen("test.txt", "r", stdin); cin>>n>>m; For(i,1,n) init(i); For(i,1,m) { int a,b,c; scanf("%d%d%d",&a,&b,&c); e[i].from=a; e[i].to=b; e[i].dis=c; } sort(e+1,e+1+m,cmp); int cnt=0; For(i,1,m) { if(find(e[i].from)!=find(e[i].to)) { unionone(e[i].from,e[i].to); cnt++; ans=e[i].dis;//因为已经排了序,直接赋值就好 if(cnt==n-1)break; //押尾 } } cout<<ans; return 0; }