1 program ddk; 2 type ty=record 3 x,y,z:longint; 4 end; 5 var a:array[1..500]of longint; 6 b:array[0..5000]of ty; 7 n,i,j,m,max,max1,min,min1,a1,a2,s,t:longint; 8 procedure kuai(s,t:longint); 9 var i,j,p:longint; 10 begin 11 i:=s; 12 j:=t; 13 p:=b[(s+t)div 2].z; 14 repeat 15 while b[i].z<p do 16 inc(i); 17 while b[j].z>p do 18 dec(j); 19 if j>=i 20 then 21 begin 22 b[0]:=b[i]; 23 b[i]:=b[j]; 24 b[j]:=b[0]; 25 inc(i); 26 dec(j); 27 end; 28 until i>j; 29 if i<t 30 then kuai(i,t); 31 if j>s 32 then kuai(s,j); 33 end; 34 function zhao(a1:longint):longint; 35 begin 36 if a[a1]<>a1 37 then 38 begin 39 a[a1]:=zhao(a[a1]); 40 exit(a[a1]); 41 end 42 else exit(a[a1]); 43 end; 44 function gcd(a1,a2:longint):longint; 45 var a3:longint; 46 begin 47 repeat 48 a3:=a1 mod a2; 49 a1:=a2; 50 a2:=a3; 51 until a2=0; 52 exit(a1); 53 end; 54 begin 55 max:=9999999; 56 min:=1; 57 read(n,m); 58 for i:=1 to m do 59 read(b[i].x,b[i].y,b[i].z); 60 kuai(1,m); 61 read(s,t); 62 for i:=1 to m do 63 begin 64 for j:=1 to n do 65 a[j]:=j; 66 max1:=b[i].z; 67 min1:=0; 68 for j:=i downto 1 do 69 begin 70 a1:=zhao(b[j].x); 71 a2:=zhao(b[j].y); 72 a[a2]:=a1; 73 if zhao(s)=zhao(t) 74 then 75 begin 76 min1:=b[j].z; 77 break; 78 end; 79 end; 80 if (min1<>0)and(max/min>max1/min1) 81 then 82 begin 83 max:=max1; 84 min:=min1; 85 end; 86 end; 87 if max=9999999 88 then writeln(‘IMPOSSIBLE‘) 89 else 90 if max mod min=0 91 then writeln(max div min) 92 else 93 begin 94 a1:=gcd(max,min); 95 writeln(max div a1,‘/‘,min div a1); 96 end; 97 end.
将边按权值排序之后,从小到大枚举最大边,用并查集维护s,t是否相连,刚相连是跳出,算出比值,不断更新答案
原文:http://www.cnblogs.com/xydddd/p/5232770.html