洛谷 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 }

 

posted @ 2017-05-17 21:41  ioioioioioio  阅读(111)  评论(0编辑  收藏  举报