[ luogu ] P111 修理公路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ luogu ] P111 修理公路相关的知识,希望对你有一定的参考价值。
题目背景
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<bits/stdc++.h> 2 using namespace std; 3 struct f{int x,y,t;} a[100050]; 4 5 int cmp(f a,f b)//自定义排列结构体,时间由短到长排序 6 { 7 if(a.t!=b.t) 8 return a.t<b.t; 9 else 10 return a.x<b.x; 11 } 12 int n,m; 13 int root[10500],size[10500];//root代表空间,把相互连通的道路编入一个空间里 14 //size代表数量,当一个房间数量与总数相同时,所有道路连通 15 int find(int x) 16 { 17 if(root[x]!=x)//当该道路的空间不属于它本身时,寻找它所属的空间 18 root[x]=find(root[x]); 19 return root[x]; 20 } 21 22 int main() 23 { 24 cin>>n>>m;//n代表村庄总数,m代表指令的数量 25 for(int i=1;i<=m;i++) 26 cin>>a[i].x>>a[i].y>>a[i].t;//输入题目中的两个村庄(x,y)和时间(t) 27 28 sort(a+1,a+1+m,cmp);//上面所写到的排序 29 30 for(int i=1;i<=n;i++) 31 { 32 root[i]=i; 33 size[i]=1; 34 }//初始化定义每个村庄空间属于自己,空间数量为1 35 36 int l=1; 37 while(l<=m)//从第一条指令开始读入 38 { int q,p; 39 q=a[l].x; 40 p=a[l].y; 41 int rq,rp;//rq,rp代表p和q所在的空间 42 rq=find(q);rp=find(p); 43 if(rq!=rp)//当两个村庄空间不同的时候,合并起来,数量集中在一个空间中 44 {root[rq]=root[rp]; 45 size[rp]+=size[rq]; 46 size[rq]=0;//清零,防止出事 47 if(size[rp]==n)//当一个房间数量与总数相同时,所有道路连通 48 {cout<<a[l].t;break;}} 49 if(l==m)//如果满足题意,上面已经退出= = 50 {cout<<-1;break;} 51 l++;} 52 53 return 0; 54 }
以上是关于[ luogu ] P111 修理公路的主要内容,如果未能解决你的问题,请参考以下文章
佳能IP4200喷墨打印机出现6502错误代码,黄灯和绿灯交替闪19次是啥原因?怎么修理?