| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
WA了千万次,求解释,或大神给个数据program mst;
var
x,y,c,f:array [1..600000] of longint;
n,m,i,j,sum,cost,v1,v2,min,max,mm,xx:longint;
procedure qsort(l,r : longint);
var i,j,xx,tmp : longint;
begin
i := l; j := r; xx := c[(l+r)div 2];
repeat
while c[i] < xx do inc(i);
while c[j] > xx do dec(j);
if i <= j then
begin
tmp := x[i]; x[i] := x[j]; x[j] := tmp;
tmp := y[i]; y[i] := y[j]; y[j] := tmp;
tmp := c[i]; c[i] := c[j]; c[j] := tmp;
inc(i); dec(j);
end
until i > j;
if l < j then qsort(l,j);
if i < r then qsort(i,r);
end;
function find(i:longint):longint;
begin
if f[i]<>i then find:=find(f[i])
else find:=i;
f[i]:=find
end;
begin
while true do
begin
read(n,m);
if (n=0)and(m=0) then halt;
if m=0 then
begin
writeln(-1);
end
else
if n>m+1 then
begin
for i:=1 to m do
read(x[i],y[i],c[i]);
writeln(-1);
end
else
begin
for i:=1 to m do
read(x[i],y[i],c[i]);
qsort(1,m);
mm:=maxlongint;
xx:=0;
for i:=1 to m-n+2 do
begin
for j:=1 to n-1 do
f[j]:=j;
min:=maxlongint;
max:=-maxlongint;
sum:=0;
for j:=i to m do
begin
v1:=find(x[j]);
v2:=find(y[j]);
if v1<>v2 then
begin
inc(sum);
if c[j]<min then min:=c[j];
if c[j]>max then max:=c[j];
f[v1]:=v2;
if sum=n-1 then break;
end
end;
if (max=-maxlongint)and(min=maxlongint) then
if i=1 then writeln(-1) else
else if mm>max-min then mm:=max-min;
end;
writeln(mm);
end;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator