luogu P1111 修复公路

题目背景

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

题目描述

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

输入输出格式

输入格式:

第1行两个正整数N,M

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

 

输出格式:

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

 

输入输出样例

输入样例#1: 
4 4
1 2 6
1 3 4
1 4 5
4 2 3
输出样例#1: 
5

说明

N<=1000,M<=100000

x<=N,y<=N,t<=100000

 

并查集板子题目,本人比较喜欢kruskal.

 

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,MAX,fa[100001];
struct ahah{
    int l,r,dis;
}edge[100001];
bool comp(ahah a,ahah b)
{
    return a.dis<b.dis;
}
int find(int x)
{
    if(fa[x]==x)return x;
    else return fa[x]=find(fa[x]);            //路径压缩。 
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&edge[i].l,&edge[i].r,&edge[i].dis);
    }
    sort(edge+1,edge+1+m,comp);        //排序 
    for(int i=1;i<=m;i++)
    {
        int g=find(edge[i].l);
        int h=find(edge[i].r);
        if(g!=h)
        {
            fa[g]=h;
            MAX=max(MAX,edge[i].dis);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(fa[i]==i)ans++;        //若他们联通了,则只有一个点fa[]等于自身,若还有其他,则表示不联通。 
    }
    if(ans>1)                //不连通输出“-1”; 
    {
        printf("-1");
        return 0;
    }
    printf("%d",MAX);        // else.... 
}

 

此为个人略解,转载请标明出处:http://www.cnblogs.com/rmy020718/p/8832963.html

  那年你十里红妆满城佳话,可曾记得我执笔提书再次刻画,一语落罢,却是留不住他。

posted @ 2018-04-14 17:16  Manjusaka丶梦寒  阅读(177)  评论(0编辑  收藏  举报