洛谷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
并查集水题
按修复时间从早到晚排序,并查集跑一遍就行
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int mxn=120000; 8 int fa[mxn]; 9 int num[mxn]; 10 int n,m; 11 struct rode{ 12 int x,y; 13 int time; 14 }r[mxn]; 15 int cmp(const rode a,const rode b){ 16 return a.time<b.time; 17 } 18 void init(int x){ 19 for(int i=1;i<=x;i++)fa[i]=i,num[i]=1;return; 20 } 21 int find(int x){ 22 if(fa[x]==x)return x; 23 return fa[x]=find(fa[x]); 24 } 25 int main(){ 26 scanf("%d%d",&n,&m); 27 init(n); 28 int i,j; 29 for(i=1;i<=m;i++){ 30 scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].time); 31 } 32 sort(r+1,r+m+1,cmp); 33 for(i=1;i<=m;i++){ 34 int u=find(r[i].x);int v=find(r[i].y); 35 if(u!=v){ 36 fa[v]=u; 37 num[u]+=num[v]; 38 } 39 if(num[u]==n){ 40 printf("%d\n",r[i].time); 41 return 0; 42 } 43 } 44 if(num[find(1)]!=n)printf("-1\n"); 45 return 0; 46 }
本文为博主原创文章,转载请注明出处。