[CodeVS]1638 修复公路
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CodeVS]1638 修复公路相关的知识,希望对你有一定的参考价值。
题目描述 Description
A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车。政府派人修复这些公路。
给出A地区的村庄数N,和公路数M,公路是双向的。并告诉你每条公路的连着哪两个村庄,并告诉你什么时候能修完这条公路。问最早什么时候任意两个村庄能够通车,即最早什么时候任意两条村庄都存在至少一条修复完成的道路(可以由多条公路连成一条道路)
输入描述 Input Description
第1行两个正整数N,M(N<=1000,M<=100000)
下面M行,每行3个正整数x, y, t,告诉你这条公路连着x,y两个村庄,在时间t时能修复完成这条公路。(x<=N,y<=N,t<=100000)
输出描述 Output Description
如果全部公路修复完毕仍然存在两个村庄无法通车,则输出-1,否则输出最早什么时候任意两个村庄能够通车。
样例输入 Sample Input
4 4
1 2 6
1 3 4
1 4 5
4 2 3
样例输出 Sample Output
5
对于这道题,蒟蒻的想法就是直接并查集,然后最后取最大值
具体如下
题意好像是这样的吧:
就是说告诉你x,y之间有一条边相连,当然你也可以选择无视他,然后呢边上权值就是v[i]了吗,所以我们就可以用一个快排从小到大吧权值排一遍,然后呢每次判断如果x,y点没有在一个集合内就连起来,
因为说修理这些路是可以同时进行的,所以我们只需要把最大值输出就行了,当然,在此之前要先判断每两个点是否有边相连,具体请看蒟蒻代码
1 //uses math; 2 var i,j,n,m,ans,maxans:longint; 3 x,y,t:array[1..1000]of longint; 4 pre:array[1..1000]of longint; 5 function max(a,b:longint):longint; 6 begin 7 if a>b then exit(a); 8 exit(b); 9 end; 10 function find(x:longint):longint; 11 begin 12 if pre[x]=x then exit(x); 13 find:=find(pre[x]); 14 pre[x]:=find; 15 end; 16 procedure join(x,y:longint); 17 var fx,fy:longint; 18 begin 19 fx:=find(x);fy:=find(y); 20 if fx<>fy then pre[fx]:=find(fy); 21 end; 22 function judge(x,y:longint):boolean; 23 var fx,fy:longint; 24 begin 25 fx:=find(x);fy:=find(y); 26 if fx<>fy then exit(false); 27 exit(true); 28 end; 29 procedure kp(l,r:longint); 30 var i,j:longint; 31 var mid,a:longint; 32 begin 33 i:=l; 34 j:=r; 35 mid:=t[(l+r)div 2]; 36 repeat 37 while t[i]<mid do inc(i); 38 while t[j]>mid do dec(j); 39 if i<=j then 40 begin 41 a:=t[i];t[i]:=t[j];t[j]:=a; 42 a:=x[i];x[i]:=x[j];x[j]:=a; 43 a:=y[i];y[i]:=y[j];y[j]:=a; 44 inc(i);dec(j); 45 end; 46 until i>j; 47 if i<r then kp(i,r); 48 if l<j then kp(l,j); 49 end; 50 begin 51 read(n,m); 52 for i:=1 to n do pre[i]:=i; 53 for i:=1 to m do 54 read(x[i],y[i],t[i]); 55 kp(1,m); 56 for i:=1 to m do 57 begin 58 if not judge(x[i],y[i]) then 59 begin 60 maxans:=max(t[i],maxans); 61 join(x[i],y[i]); 62 end 63 else continue; 64 end; 65 for i:=1 to n do 66 for j:=1 to n do 67 begin 68 if i=j then continue; 69 if not judge(i,j) then begin writeln(‘-1‘);halt;end; 70 end; 71 writeln(maxans); 72 end.
这道题基本上可以说是并查集的模板吧
以上是关于[CodeVS]1638 修复公路的主要内容,如果未能解决你的问题,请参考以下文章