luogu P1111 修复公路
题目背景
A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。
题目描述
给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
输入输出格式
输入格式:
第1行两个正整数N,M
下面M行,每行3个正整数x, y, t,告诉你这条公路连着x,y两个村庄,在时间t时能修复完成这条公路。
输出格式:
如果全部公路修复完毕仍然存在两个村庄无法通车,则输出-1,否则输出最早什么时候任意两个村庄能够通车。
输入输出样例
说明
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
那年你十里红妆满城佳话,可曾记得我执笔提书再次刻画,一语落罢,却是留不住他。
除特别注明外,本站所有文章均为Manjusaka丶梦寒原创,转载请注明来自出处