最小生成树 kruskal算法 codevs 1638 修复公路

1638 修复公路

 

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 钻石 Diamond
 
 
 
题目描述 Description

A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。

给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)

输入描述 Input Description

第1行两个正整数N,M(N<=1000,M<=100000)

下面M行,每行3个正整数x, y, t,告诉你这条公路连着x,y两个村庄,在时间t时能修复完成这条公路。(x<=N,y<=N,t<=100000)

输出描述 Output Description

如果全部公路修复完毕仍然存在两个村庄无法通车,则输出-1,否则输出最早什么时候任意两个村庄能够通车。

样例输入 Sample Input

4 4

1 2 6

1 3 4

1 4 5

4 2 3

样例输出 Sample Output

5

 1 /*
 2 题目的意思很容易就得出:这个题是求一张图的最小生成树的最大边的。
 3 写程序的时候,没注意把father[x1]=y1;写成了father[x1]==y1;结果只有20分啊!
 4 */
 5 #define N 1005
 6 #define M 100010
 7 #include<iostream>
 8 using namespace std;
 9 #include<cstdio>
10 #include<algorithm>
11 int n,m;
12 struct Edge{
13     int u,v,w;
14     bool operator <(Edge P)
15     const{return w<P.w;}
16 }edge[M];
17 int father[N];
18 void input()
19 {
20     scanf("%d%d",&n,&m);
21     for(int i=1;i<=m;++i)
22       scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
23     sort(edge+1,edge+m+1);
24 }
25 int find1(int x)
26 {
27     return (father[x]==x)?x:father[x]=find1(father[x]);
28 }
29 int kruskal()
30 {
31     for(int i=1;i<=n;++i)
32       father[i]=i;
33     int sum=0;
34     for(int i=1;i<=m;++i)
35     {
36         int x1=find1(edge[i].u);
37         int y1=find1(edge[i].v);
38         if(x1!=y1)
39         {
40             sum++;
41             father[x1]=y1;
42             if(sum==n-1)
43               return edge[i].w;
44         }
45     }
46     return -1;
47 }
48 int main()
49 {
50     input();
51     printf("%d\n",kruskal());
52     return 0;
53 }

 

posted @ 2016-10-27 21:56  csgc0131123  阅读(522)  评论(0编辑  收藏  举报