最小生成树 kruskal算法 codevs 1638 修复公路
Posted tech-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树 kruskal算法 codevs 1638 修复公路相关的知识,希望对你有一定的参考价值。
题目描述 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 }
以上是关于最小生成树 kruskal算法 codevs 1638 修复公路的主要内容,如果未能解决你的问题,请参考以下文章
最小生成树算法Kruskal算法Prim算法切分定理贪心算法