繁忙的都市
繁忙的都市
Problem
城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口之间最多有一条道路相连接。这些道路是双向的,且把所有的交叉路口直接或间接的连接起来了。每条道路都有一个分值,分值越小表示这个道路越繁忙,越需要进行改造。但是市政府的资金有限,市长希望进行改造的道路越少越好,于是他提出下面的要求:
1.改造的那些道路能够把所有的交叉路口直接或间接的连通起来。
2.在满足要求1的情况下,改造的道路尽量少。
3.在满足要求1、2的情况下,改造的那些道路中分值最大的道路分值尽量小。
任务:作为市规划局的你,应当作出最佳的决策,选择那些道路应当被修建。
Input
第一行有两个整数n,m表示城市有n个交叉路口,m条道路。接下来m行是对每条道路的描述,u, v, c表示交叉路口u和v之间有道路相连,分值为c。(1≤n≤300,1≤c≤10000)
Output
一行,两个整数s, max,表示你选出了几条道路,分值最大的那条道路的分值是多少。
Sample Input
4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
Sample Output
3 6
Kruskal算法简单改装
1 Var 2 f,a,b,c:Array[0..10001] of longint; 3 n,m,DA,i,l,r:longint; 4 Procedure qSort(l,r:longint); 5 Var 6 i,j,Tmp,Mid:longint; 7 Begin 8 i:=l; 9 j:=r; 10 Mid:=a[(l+r) Shr 1]; 11 Repeat 12 While a[i]<Mid Do inc(i); 13 While Mid<a[j] Do Dec(j); 14 if i<=j then 15 Begin 16 Tmp:=a[i]; 17 a[i]:=a[j]; 18 a[j]:=Tmp; 19 Tmp:=b[i]; 20 b[i]:=b[j]; 21 b[j]:=Tmp; 22 Tmp:=c[i]; 23 c[i]:=c[j]; 24 c[j]:=Tmp; 25 inc(i); 26 Dec(j); 27 End; 28 Until i>j; 29 if i<r Then qSort(i,r); 30 if l<j Then qSort(l,j); 31 End; 32 Function Find(x:longint):longint; 33 Begin 34 if f[x]=0 Then Exit(x); 35 f[x]:=Find(f[x]); 36 Exit(f[x]); 37 End; 38 Begin 39 Read(n,m); 40 For i:=1 to m do 41 Read(a[i],b[i],c[i]); 42 qSort(1,m); 43 FillChar(f,SizeOf(f),0); 44 DA:=1; 45 For i:=1 to m do 46 Begin 47 l:=Find(a[i]); 48 r:=Find(b[i]); 49 if l<>r Then 50 Begin 51 Inc(DA); 52 f[l]:=r; 53 if DA=n Then 54 Begin 55 Writeln(DA-1,' ',c[i]); 56 Exit; 57 End; 58 End; 59 End; 60 End.