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

解题思路

这是一道灰常灰常裸的最短路,用并查集优化的克鲁斯卡尔就好。。。呼呼呼

 1 program RebuildPath;
 2 type paa=record
 3 l,r,t:longint;
 4 end;
 5 var
 6 ro:array[1..1000] of longint;
 7 pa:array[1..100000] of paa;
 8 m,n,i,j,ans,cheak:Longint;
 9 function root(i:longint):longint;
10 begin
11     if ro[i]=i then exit(i);
12     root:=root(ro[i]);
13     ro[i]:=root;
14     exit(root);
15 end;
16 
17 procedure union(x,y:Longint);
18 begin
19     ro[root(x)]:=root(y);
20 end;
21 
22 procedure sort(l,r: longint);
23       var
24          i,j,x: longint;
25          y:paa;
26       begin
27          i:=l;
28          j:=r;
29          x:=pa[(l+r) div 2].t;
30          repeat
31            while pa[i].t<x do
32             inc(i);
33            while x<pa[j].t do
34             dec(j);
35            if not(i>j) then
36              begin
37                 y:=pa[i];
38                 pa[i]:=pa[j];
39                 pa[j]:=y;
40                 inc(i);
41                 j:=j-1;
42              end;
43          until i>j;
44          if l<j then
45            sort(l,j);
46          if i<r then
47            sort(i,r);
48       end;
49 begin
50     read(n,m);
51     for i:=1 to n do ro[i]:=i;
52     for i:=1 to m do
53     begin
54         read(pa[i].l,pa[i].r,pa[i].t);
55     end;
56     sort(1,m);
57     for i:=1 to m do
58     if (root(pa[i].l))<>root(pa[i].r) then
59     begin
60         union(root(pa[i].l),root(pa[i].r));
61         ans:=pa[i].t;
62     end;
63     cheak:=root(1);
64     for i:=1 to n do if root(i)=cheak then continue else
65     begin
66         writeln(-1);
67         halt;
68     end;
69     writeln(ans);
70 end.
原文地址:https://www.cnblogs.com/wuminyan/p/4738256.html