[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]修复公路的更多相关文章

  1. [luoguP1111] 修复公路(并查集)

    传送门 呵呵的最小生成树 ——代码 #include <cstdio> #include <iostream> #include <algorithm> #defi ...

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

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

  3. P1111 修复公路

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

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

    Luogu 1111 修复公路(最小生成树) Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的 ...

  5. 洛谷P1111 修复公路

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

  6. 洛谷 P1111 修复公路 Label:并查集

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

  7. CODEVS 1638 修复公路

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

  8. 洛谷 P1111 修复公路

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

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

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

随机推荐

  1. ie兼容性问题汇总

    1.eval函数 <script type="text/javascript"> //eval的兼容性 var s="function(){alert('te ...

  2. python读取excel表格生成sql语句 第一版

    由于单位设计数据库表·,都用sql.不知道什么原因不用 powerdesign或者ermaster工具,建表很痛苦  作为程序猿当然要想办法解决,用Python写一个程序解决 需要用到 xlrd li ...

  3. TOJ 4394 Rebuild Road

    描述 Once,in a kingdom,there are N cities.M roads have been buit such that from one city you can reach ...

  4. 【算法】K-Means聚类算法(k-平均或k-均值)

    1.聚类算法和分类算法的区别 a)分类 分类(Categorization or Classification)就是按照某种标准给对象贴标签(label),再根据标签来区分归类. 举例: 假如你有一堆 ...

  5. python 生成、删除、拷贝目录

    1. 生成目录 函数原型:distutils.dir_util.mkpath(name[, mode=0777, verbose=0, dry_run=0]) from distutils impor ...

  6. dpkg: error: dpkg status database is locked by another process 解决方法

    使用dpkg -i/apt命令安装,报错: ------------------------------------------------------------- dpkg: error: dpk ...

  7. 深入理解JavaScript系列(28):设计模式之工厂模式

    介绍 与创建型模式类似,工厂模式创建对象(视为工厂里的产品)时无需指定创建对象的具体类. 工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类.该模式使一个类的实例化延迟到了子类.而子 ...

  8. Javascript 对象Object

    1.new构造函数法 2.对象字面量 对象字面量很好理解,使用key/value的形式直接创建对象,简洁方便.   这种方式直接通过花括号将对象的属性包起来,使用key/value的方式创建对象属性, ...

  9. linux基础-linux和unix的区别

    有时候我们对天天使用的Linux指令,只知道怎么用,却分不清概念用法区别,我觉得很有必要整理整理大家熟视无睹的一些linux概念区别. 首先说说unix和linux的区别: linux和unix的最大 ...

  10. 注解实现AOP

    package com.dch.service.aop; import java.text.SimpleDateFormat; import java.util.Arrays; import java ...