谁来帮我看下我用的Kruscal+并查哪里错了

样例过了,数据只过了一个点
type node=record
left,right,v:longint;
end;
var m,n:longint;

g:array[1..10000] of node;
father:array[1..10000] of integer;
max:longint;

procedure init;
var i:longint;
begin
read(n,m);
for i:=1 to m do father[i]:=i;
for i:=1 to m do
read(g[i].left,g[i].right,g[i].v);
end;

procedure sort(l,r: longint);
var
i,j,x: longint;
y:node;
begin
i:=l;
j:=r;
x:=g[random(r-l+1)+l].v;
repeat
while g[i].v<x do
inc(i);
while x<g[j].v do
dec(j);
if not(i>j) then
begin
y:=g[i];
g[i]:=g[j];
g[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;

function getfather(v:longint):longint;
begin
if father[v]=v then exit(v)
else father[v]:=getfather(father[v]);
exit(father[v]);
end;

function union(x,y:longint):boolean;
var fx,fy:longint;
begin
fx:=getfather(father[x]);
fy:=getfather(father[y]);
if fx=fy then exit(true)
else union:=false;
father[fx]:=fy;

end;

procedure kruscal;
var cnt,i,ans:longint;
begin
cnt:=0;ans:=0;
for i:=1 to n do
if getfather(g[i].left) <> getfather(g[i].right) then
begin
union(g[i].left,g[i].right);
if max<g[i].v then max:=g[i].v;
inc(cnt);
if cnt=n-1 then break;
end;
end;

begin
max:=0;
randomize;
init;
sort(1,m);
kruscal;
write(n-1,' ',max);
end.

4 条评论

  • @ 2014-08-10 16:40:00

    沙发

  • @ 2014-08-10 16:39:37

    !!_!!

  • @ 2014-04-12 19:27:46

    应该用for

  • @ 2014-04-11 23:20:51

    kruscal的部分错了。它不能保证(n-1)条边都加入最小生成树的要求。需要把for改成while

  • 1

信息

ID
1190
难度
5
分类
树结构 | 生成树 点击显示
标签
递交数
2962
已通过
1132
通过率
38%
被复制
7
上传者