Luogu 1111 修复公路(最小生成树)

Description

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

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

Input

第1行两个正整数N,M

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

Output

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

Sample Input

4 4

1 2 6

1 3 4

1 4 5

4 2 3

Sample Output

5

Http

Luogu:https://www.luogu.org/problem/show?pid=1111

Source

最小生成树 并查集

题目大意

求图中满足所有点联通的边的集合中最大值最下(说得简单点,就是求一个图的最小生成树并输出树上的最大边)

解决思路

首先用克鲁斯卡尔算法求出最小生成树,具体做法是:

  1. 将所有的边按照边权值从小到大排序
  2. 从第一条边开始枚举,每次判断这条边的两端点,若都已经在一个连通块里了,跳过,若不在,连接这条边并合并这两个连通块
  3. 持续上述操作,直到连接了n-1条边(为什么是n-1条呢?因为一棵树的边就是n-1条啊)或是所有的边都扫描过了(此时代表无解,原图不连通)

那么现在的问题就是如何判断两个点已经在同一连通块中了呢?

没错!我们用并查集来判断连通块。

定义一个F[i](代码中用Mayuri[i])来表示i所属的并查集编号。开始时每一个点都是一个孤立的连通块,所以每一个F[i]=i。在合并两个点u,v时,只要将u,v所在的并查集合并就可以将两个连通块合并了,具体操作就是将F[u]置为F[v],但这样是有问题的,因为u所在的并查集编号并不一定是F[u],所以要一直向上搜寻,我们用一个Find()函数来表示,递归地找到最早的编号。

但是这样有可能出现树退化成链表的情况,所以在Find函数查找时,顺便压缩路径(具体请看代码)

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; class Road
{
public:
int u,v,w;
}; bool operator < (Road a,Road b)//因为要排序,所以重载一下小于运算符
{
return a.w<b.w;
} const int maxN=2000;
const int maxM=101000;
const int inf=2147483647; int n,m;
int Mayuri[maxN];
Road E[maxM]; int Find(int x); int main()
{
int Ans=0;
int cnt=0;
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>E[i].u>>E[i].v>>E[i].w;
}
sort(&E[1],&E[m+1]);
for (int i=1;i<=n;i++)//并查集初始化
Mayuri[i]=i;
int i=0;
do
{
i++;
int fu=Find(E[i].u);
int fv=Find(E[i].v);
if (fu!=fv)//如果u,v不在同一个连通块,就合并
{
cnt++;//统计选择了的边的个数,便于及时退出和判断是否有解
Ans=max(E[i].w,Ans);//更新答案
Mayuri[fu]=fv;
}
if (cnt==n-1)//当已经形成一个树时,及时退出循环
break;
}
while (i<m);
if (cnt==n-1)
cout<<Ans<<endl;
else
cout<<-1<<endl;
return 0;
} int Find(int x)
{
if (Mayuri[x]!=x)
Mayuri[x]=Find(Mayuri[x]);//压缩路径,让每一个点都直接指向其并查集编号的那个点
return Mayuri[x];
}

Luogu 1111 修复公路(最小生成树)的更多相关文章

  1. Luogu P1265修复公路【Prim最小生成树】By cellur925

    题目传送门 政府审批的规则如下: (1)如果两个或以上城市申请修建同一条公路,则让它们共同修建: (2)如果三个或以上的城市申请修建的公路成环.如下图,A申请修建公路AB,B申请修建公路BC,C申请修 ...

  2. [LUOGU] P1111 修复公路

    题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...

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

    1638 修复公路  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description A地区在地震过后,连接所有村庄的公 ...

  4. P1111 修复公路

    P1111 修复公路 550通过 1.6K提交 题目提供者该用户不存在 标签并查集 难度普及/提高- 提交该题 讨论 题解 记录   题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通 ...

  5. [LuoguP1111]修复公路

    [LuoguP1111]修复公路 题目描述: A地区在地震过后,链接所有村庄的公路都损坏了,而导致无法通车,政府派人修复这些公路. 给出A地区的N村庄数和M公路数,并且对于每一个公路给出其链接的两个村 ...

  6. 洛谷 P1111 修复公路(最小生成树)

    嗯... 题目链接:https://www.luogu.org/problemnew/show/P1111 这道题的关键是读懂题: 首先根据题中的一些扎眼的字眼我们可以判断这是一道用最小生成树来做的题 ...

  7. (最小生成树 并查集)P1111 修复公路 洛谷

    题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...

  8. 洛谷 P1111 修复公路

    题目链接 https://www.luogu.org/problemnew/show/P1111 以后只发题目链接!!! 题目大意 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连 ...

  9. P1111 修复公路 洛谷

    https://www.luogu.org/problem/show?pid=1111 题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地 ...

随机推荐

  1. javaSE_06Java中的数组(array)

    1.什么是数组? 顾名思义,即为数据的组合或集合,数组就是用来表示一组数据的. 比如没有数组之前,我们要存储多个姓名的信息 String name1; String name2; String nam ...

  2. hive报错 Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct MetaStore DB connections,

    学习hive 使用mysql作为元数据  hive创建数据库和切换数据库都是可以的 但是创建表就是出问题 百度之后发现 是编码问题 特别记录一下~~~ 1.报错前如图: 2.在mysql数据库中执行如 ...

  3. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  4. kali高速更新源以及主题修改方法

    文章不小心删了~这是我以前写的文章了了.实用性较强,所以现在补回来! 安装完kali之后,需要对软件进行一次整体更新:apt-get update & apt-get upgrade 但是,先 ...

  5. iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

    今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UIColle ...

  6. Step by Step 用Azure Automation 来开虚机(ARM)

    使用Azure Automation来自动化处理各种重复的耗时的云管理任务从而帮助云运维人员提升效率,帮助降低运营成本. 具体相关的介绍以及怎样利用Azure Automation来完成定期开关虚拟机 ...

  7. go 测试sort性能

    package main import "fmt" import "os" import "flag" import "bufio ...

  8. vue中使用stompjs实现mqtt消息推送通知

    最近在研究vue+webAPI进行前后端分离,在一些如前端定时循环请求后台接口判断状态等应用场景用使用mqtt进行主动的消息推送能够很大程度的减小服务端接口的压力,提高系统的效率,而且可以利用mqtt ...

  9. 点击页面其它地方隐藏该div的方法

    思路一 第一种思路分两步 第一步:对document的click事件绑定事件处理程序,使其隐藏该div 第二步:对div的click事件绑定事件处理程序,阻止事件冒泡,防止其冒泡到document,而 ...

  10. [leetcode-541-Reverse String II]

    Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...