您的位置:首页 > 其它

bzoj 1050: [HAOI2006]旅行comf

2016-03-01 22:30 369 查看
program ddk;
type ty=record
x,y,z:longint;
end;
var a:array[1..500]of longint;
b:array[0..5000]of ty;
n,i,j,m,max,max1,min,min1,a1,a2,s,t:longint;
procedure kuai(s,t:longint);
var i,j,p:longint;
begin
i:=s;
j:=t;
p:=b[(s+t)div 2].z;
repeat
while b[i].z<p do
inc(i);
while b[j].z>p do
dec(j);
if j>=i
then
begin
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
inc(i);
dec(j);
end;
until i>j;
if i<t
then kuai(i,t);
if j>s
then kuai(s,j);
end;
function zhao(a1:longint):longint;
begin
if a[a1]<>a1
then
begin
a[a1]:=zhao(a[a1]);
exit(a[a1]);
end
else exit(a[a1]);
end;
function gcd(a1,a2:longint):longint;
var a3:longint;
begin
repeat
a3:=a1 mod a2;
a1:=a2;
a2:=a3;
until a2=0;
exit(a1);
end;
begin
max:=9999999;
min:=1;
read(n,m);
for i:=1 to m do
read(b[i].x,b[i].y,b[i].z);
kuai(1,m);
read(s,t);
for i:=1 to m do
begin
for j:=1 to n do
a[j]:=j;
max1:=b[i].z;
min1:=0;
for j:=i downto 1 do
begin
a1:=zhao(b[j].x);
a2:=zhao(b[j].y);
a[a2]:=a1;
if zhao(s)=zhao(t)
then
begin
min1:=b[j].z;
break;
end;
end;
if (min1<>0)and(max/min>max1/min1)
then
begin
max:=max1;
min:=min1;
end;
end;
if max=9999999
then writeln('IMPOSSIBLE')
else
if max mod min=0
then writeln(max div min)
else
begin
a1:=gcd(max,min);
writeln(max div a1,'/',min div a1);
end;
end.
将边按权值排序之后,从小到大枚举最大边,用并查集维护s,t是否相连,刚相连是跳出,算出比值,不断更新答案
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: