1. 程式人生 > >洛谷1111修復公路

洛谷1111修復公路

printf print pri 能夠 ++ style space using 正整數

題目背景

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

說明

N1000,M100000

xN,yN,t100000

 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 }

洛谷1111修復公路