题目背景
A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。
题目描述
给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
输入输出格式
输入格式:
第1行两个正整数N,M
下面M行,每行3个正整数x,y,t,告诉你这条公路连着x,y两个村庄,在时间t时能修复完成这条公路。
输出格式:
如果全部公路修复完毕仍然存在两个村庄无法通车,则输出−1,否则输出最早什么时候任意两个村庄能够通车。
输入输出样例
说明
N≤1000,M≤100000
x≤N,y≤N,t≤100000
****并查集,s记录连接的边数
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 int i,j,n,m,fa[1005],s = 0,ans = 0,u,v; 7 struct node 8 { 9 int x; 10 int y; 11 int t; 12 }a[100005]; 13 int cmp(node a,node b) 14 { 15 return a.t < b.t; 16 } 17 int find(int x) 18 { 19 if(fa[x] != x) 20 { 21 x = find(fa[x]); 22 } 23 return x; 24 } 25 int main() 26 { 27 scanf("%d %d",&n,&m); 28 for(i = 1;i <= n;i++) 29 { 30 fa[i] = i; 31 } 32 for(i = 1;i <= m;i++) 33 { 34 scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].t); 35 } 36 sort(a + 1,a + 1 + m,cmp); 37 for(i = 1;i <= m;i++) 38 { 39 u = find(a[i].x); 40 v = find(a[i].y); 41 if(u != v) 42 { 43 s++; 44 fa[u] = v; 45 ans = max(ans,a[i].t); 46 } 47 } 48 if(s < n - 1) 49 printf("-1"); 50 else 51 printf("%d",ans); 52 return 0; 53 }