最小生成树 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 }
时间: 2024-10-24 04:29:53

最小生成树 kruskal算法 codevs 1638 修复公路的相关文章

CODEVS 1638 修复公路

题目描述 Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路.问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路) 输入描述 Input Description 第1行两个正整数N,M(N<=1000,M<=100000) 下面M行,每行3个正整数x, y, 

SOJ4339 Driving Range 最小生成树 kruskal算法

典型的最小生成树 然后求最大的一条边 附上链接 http://cstest.scu.edu.cn/soj/problem.action?id=4339 需要注意的是有可能有 "IMPOSSIBLE" 的情况 这里用一个flag标记 记录所并的节点 只有flag = n时才能成功 负责就 "IMPOSSIBLE" 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&g

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

最小生成树 Kruskal算法

Kruskal算法 1.概览 Kruskal算法是一种用来寻找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪婪算法的应用.和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效. 2.算法简单描述 1).记Graph中有v个顶点,e个边 2).新建图Graphnew,Graphnew中拥有原图中相同的e个顶点,但没有边 3).将原图Graph中所有e个边按权值从小到大排序 4)

无向图最小生成树Kruskal算法

问题 最小生成树的Kruskal算法 描述:有A.B.C.D四个点,每两个点之间的距离(无方向)是(第一个数字是两点之间距离,后面两个字母代表两个点):(1,'A','B'),(5,'A','C'),(3,'A','D'),(4,'B','C'),(2,'B','D'),(1,'C','D') 生成边长和最小的树,也就是找出一种连接方法,将各点连接起来,并且各点之间的距离和最小. 思路说明: Kruskal算法是经典的无向图最小生成树解决方法.此处列举两种python的实现方法.这两种方法均参考

最小生成树Kruskal算法的提出者Joseph Bernard Kruskal,Jr.

熟悉算法中的最小生成树的朋友都晓得有一个Kruskal算法,这个算法就是由题目中那个名字很长的人提出的.因为他功绩卓越,尊称他为Kruskal. Kruskal生于1928年1月29日,卒于2010年9月19日,美国人,维基里的词条中包含的头衔是:数学家.统计学家.计算机科学家.心理测量学专家. kruskal分别就读过芝加哥大学和普林斯顿大学,1954年获得博士学位. 下面链接中是一篇几年他的文章,从中可以了解他的更多成就.顺便说一句,他的父母和兄弟也都很牛. http://pan.baidu

ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 最小生成树 Kruskal算法

题目链接:ZOJ 1718 POJ 2031 Building a Space Station 修建空间站 Building a Space Station Time Limit: 2 Seconds      Memory Limit: 65536 KB You are a member of the space station engineering team, and are assigned a task in the construction process of the statio

最小生成树——Kruskal算法

前面介绍了最小生成树和Prim算法,这篇博客继续记录Kruskal算法的相关内容. 算法思想: 1. 先将所有边按权值由小到大排序: 2. 从边集中选出第一条边(即权值最小的边),如果与树中现有的边不构成环,则将其加入树中: 3. 重复步骤2直至树中有n-1条边. 在实现上述算法之前,要先解决三个问题: 1. 如何表示一条边? 虽然我们尽量简化情景方便实现,但是边还是不能像节点一样简单地用一个数表示,因为它有三个必备的属性:起点.终点和权值.因此,我们创建以下结构体来表示边: 1 // 定义表示

最小生成树Kruskal算法

Kruskal算法就是把图中的所有边权值排序,然后从最小的边权值开始查找,连接图中的点,当该边的权值较小,但是连接在途中后会形成回路时就舍弃该边,寻找下一边,以此类推,假设有n个点,则只需要查找n-1条边即可. #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int maxn=1000; int v,l