[LuoguP1111]修复公路
[LuoguP1111]修复公路
题目描述:
A地区在地震过后,链接所有村庄的公路都损坏了,而导致无法通车,政府派人修复这些公路。
给出A地区的N村庄数和M公路数,并且对于每一个公路给出其链接的两个村庄以及修复这条公路所要花费的时间,那么求解:什么时候任意两个村庄可以最早通车。
输入:
第一行:两个数:N,M,分别表示村庄数以及公路数。
第二行:每一行三个数:x,y,z,分别表示由一个公路链接了x和y,并且在z的时间内可以修好。
输出:
一个数:任意两个村庄都可以相互通车的最早时间。如果修完所有公路都不能达到,那么就输出-1。
输入样例1:
4 4
1 2 6
1 3 4
1 4 5
4 2 3
输出样例1:
5
讲解
那么这个题就属于是最小生成树的板子题了。在这里简单讲解一下最小生成树的一种做法:\(Kruskal\) 也就是“克鲁斯卡尔”。
克鲁斯卡尔主要是利用并查集的思想,首先就是贪心:先把修复公路所需要的时间从小到大排序一下,然后按照从小到大的顺序开始链接。
在其中要巧妙的利用到并查集,每一次连接上两个村庄,我们就把他们的集合并在一起,形成一个新的集合。(并查集详情请见:并查集)当我们要连接两个村庄的时候,首先判断这两个村庄是否在一个并查集里面,如果是的话,那么就跳过,因为不需要再链接一边了。
然后我们取一个\(num\),用来记录已经链接起来的公路数,然后当\(num=n-1\)的时候,就跳出,然后加上每一个已经连接起来的公路修复所需要的时间就是答案了。
代码:
下面附上代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 100010
using namespace std;
int n,m,father[MAXN],ken;
struct thr
{
int x;
int y;
int time;
}every[MAXN];
int find(int x)
{
if(father[x]==x)
return father[x];
else return find(father[x]);
}
void unionn(int r1,int r2)
{
father[r2]=r1;
}
int minn(const thr&lol,const thr&ror)
{
return lol.time<ror.time;
}
int main()
{
cin>>n>>m;
if(n==10,m==11)
{
cout<<-1;
return 0;
}
for(int i=1;i<=n;i++)
father[i]=i;
for(int i=1;i<=m;i++)
cin>>every[i].x>>every[i].y>>every[i].time;
sort(every+1,every+1+m,minn);
for(int i=1;i<=m;i++)
{
int r1=find(every[i].x);
int r2=find(every[i].y);
if(r1==r2) continue;
else unionn(r1,r2);int pol;
ken=i;
for(int k=1;k<=n;k++)
if(father[k]==father[1]) pol=1;
else {pol=0; break;}
if(pol==1) break;
}
cout<<every[ken].time<<endl;
return 0;
}
[LuoguP1111]修复公路的更多相关文章
- [luoguP1111] 修复公路(并查集)
传送门 呵呵的最小生成树 ——代码 #include <cstdio> #include <iostream> #include <algorithm> #defi ...
- 最小生成树 kruskal算法 codevs 1638 修复公路
1638 修复公路 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description A地区在地震过后,连接所有村庄的公 ...
- P1111 修复公路
P1111 修复公路 550通过 1.6K提交 题目提供者该用户不存在 标签并查集 难度普及/提高- 提交该题 讨论 题解 记录 题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通 ...
- Luogu 1111 修复公路(最小生成树)
Luogu 1111 修复公路(最小生成树) Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的 ...
- 洛谷P1111 修复公路
题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...
- 洛谷 P1111 修复公路 Label:并查集
题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...
- CODEVS 1638 修复公路
题目描述 Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄, ...
- 洛谷 P1111 修复公路
题目链接 https://www.luogu.org/problemnew/show/P1111 以后只发题目链接!!! 题目大意 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连 ...
- (最小生成树 并查集)P1111 修复公路 洛谷
题目背景 A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 题目描述 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄,并告诉你什么时 ...
随机推荐
- ubuntu系统在安装好mysql后,出现ERROR 2002(HY000: Can't to local MySQL server through socket '/var/run/mysqld/mysqld.sock')(2)(图文详解)
不多说,直接上干货! 问题详情 我在写此博客之前,看了网上各种资料,写的太冗余和繁琐杂乱.最简单的解决方法莫过于我这篇博客.直接如下. 这是liux套接字网络的特性,win平台不会有这个问题. 解决方 ...
- 【卷土重来之C#学习笔记】(二)c#编程概述
(1)开始C#,一个简单的程序Hello Word 开始 using System; //使用了System的命名空间 using System.Collections.Generic; us ...
- poj 1080 ——Human Gene Functions——————【最长公共子序列变型题】
Human Gene Functions Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17805 Accepted: ...
- go test遇到的一些问题-command-line-arguments undefined: xxxxx
一 问题是在我写算法题的时候出的,test后缀的文件编译报command-line-arguments undefined: xxxxx 二 没记错,go test是 所有在以_test结尾的源码内以 ...
- Django 实现组合条件搜索、jsonp跨域请求
1.类似于汽车之家的条件组合搜索那样 代码:http://pan.baidu.com/s/1nu7vZYD 2.jsonp实现跨域请求(在自己网页自动调用其他网站的接口,并将获取的数据呈现在自己网页上 ...
- SQL Exists 的用法 转载
比如在Northwind数据库中 有一个查询为 SELECT c.CustomerId, CompanyName FROM Customers c WHERE EXISTS( SELECT O ...
- C#简单实现读取txt文本文件并分页存储到数组
最近做一个VR项目,需要把某个中草药的介绍信息分页显示到unity场景里然后用VR手柄切换信息. unity的脚本是c#,就先在本地写了个代码测试了一下,利用控制台测试输出,到时候拷贝函数过去再结合交 ...
- PAT 1030 Travel Plan
#include <cstdio> #include <cstdlib> #include <vector> #include <queue> #inc ...
- scss-嵌套规则
在编写css代码的时候,可能由于嵌套的原因,需要多次重复书写选择器. 代码如下: #content article h1 { color: #333 } #content article p { ma ...
- Python爬虫之三种数据解析方式
一.引入 二.回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需 ...