讨论 / 为什么我的Kruskal会错?
chowfun 2010-06-30 09:58:00
点我顶贴 收藏 删除
在USACO上AC的原程序,在这里就WA:0了,为什么?

program kruskal_RQ;

type

node=record

p,s:longint;

v:longint;

end;

var

e:array[1..10000]of node;

f:array[1..1000]of longint;

i,j,n,m,tot,p:longint;

procedure Qsort(l,r:longint);

var

i,j,x,t:longint;

begin

i:=l; j:=r; x:=e[(i+j)div 2].v;

repeat

while e[i].v<x do inc(i);

while e[j].v>x do dec(j);

if i<=j then begin

t:=e[i].v; e[i].v:=e[j].v; e[j].v:=t;

t:=e[i].p; e[i].p:=e[j].p; e[j].p:=t;

t:=e[i].s; e[i].s:=e[j].s; e[j].s:=t;

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(x:longint):longint;

begin

if f[x]<>x then f[x]:=find(f[x]);

exit(f[x]);

end;

procedure union(x,y:integer);

var

rx,ry:integer;

begin

rx:=find(x);

ry:=find(y);

if rx<>ry then f[rx]:=ry;

end;

procedure Kruskal;

var

i,k:longint;

begin

k:=0;

for i:=1 to m do if find(e[i].p)<>find(e[i].s) then begin

inc(tot,e[i].v);

union(e[i].p,e[i].s);

inc(k);

if k=m-1 then exit;

end;

end;

begin

readln(n);

for i:=1 to n do begin

for j:=1 to n do begin

read(p);

if i<j then begin

inc(m);

e[m].p:=i; e[m].s:=j; e[m].v:=p;

end;

end;

readln;

end;

Qsort(1,m);

for i:=1 to n do f[i]:=i;

Kruskal;

writeln(tot);

end.

#1 zouxiang@2010-05-04 03:18:00
回复 删除
回复 楼主chowfun 的帖子

Me Too!!!!!

总是0分。

#2 yanlaoda1@2010-06-16 03:42:00
回复 删除
我也是,但后来用Prim就AC了
#3 Alux@2010-06-30 09:58:00
回复 删除
procedure Kruskal;

var

i,k:longint;

begin

k:=0;

for i:=1 to m do if find(e[i].p)<>find(e[i].s) then begin

inc(tot,e[i].v);

union(e[i].p,e[i].s);

inc(k);

if k=m-1 then exit;

end;

end;

最后的m-1应该是n-1吧?

查看更多回复
提交回复