洛谷 P1111 修复公路
题目背景
A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。
题目描述
给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
输入输出格式
输入格式:第1行两个正整数N,M
下面M行,每行3个正整数x, y, t,告诉你这条公路连着x,y两个村庄,在时间t时能修复完成这条公路。
输出格式:如果全部公路修复完毕仍然存在两个村庄无法通车,则输出-1,否则输出最早什么时候任意两个村庄能够通车。
输入输出样例
输入样例#1:
4 4 1 2 6 1 3 4 1 4 5 4 2 3
输出样例#1:
5
说明
N<=1000,M<=100000
x<=N,y<=N,t<=100000
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 const int N=1010; 7 8 int f[N]; 9 int now; 10 int ans[N]; 11 12 struct node{ 13 int u,v,w; 14 }E[N*100]; 15 16 inline void read(int &x) 17 { 18 char c=getchar(); 19 x=0; 20 while(c<'0'||c>'9')c=getchar(); 21 while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar(); 22 } 23 24 inline int find(int x) 25 { 26 if(f[x]!=x) 27 f[x]=find(f[x]); 28 return f[x]; 29 } 30 31 inline void un(int x,int y) 32 { 33 f[find(x)]=find(y); 34 } 35 36 inline bool cmp(node a,node b) 37 { 38 return a.w<b.w; 39 } 40 41 int main() 42 { 43 int n,m; 44 read(n);read(m); 45 for(int i=1;i<=n;i++) 46 f[i]=i; 47 for(int i=1;i<=m;i++) 48 { 49 read(E[i].u); 50 read(E[i].v); 51 read(E[i].w); 52 } 53 sort(E+1,E+m+1,cmp); 54 55 int tot=0; 56 for(int i=1;i<=m;i++) 57 { 58 if(find(E[i].u)!=find(E[i].v)) 59 { 60 un(E[i].u,E[i].v); 61 tot++; 62 ans[tot]=E[i].w; 63 } 64 if(tot==n-1)break; 65 } 66 if(tot!=n-1)printf("-1"); 67 else 68 { 69 sort(ans+1,ans+tot+1); 70 printf("%d",ans[tot]); 71 } 72 return 0; 73 }