1. 程式人生 > >luogu P1111 修復公路

luogu P1111 修復公路

等於 ans .com AD clas OS pan cst return

題目背景

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

luogu P1111 修復公路