/ Vijos / 讨论 / 家族 /

求助:这个程序有什么问题

program t1;

var

set1:array[1..5000]of integer;

m,n,p:integer;

i,j:integer;

function find(k:integer):integer;

begin

exit(set1[k]);

end;

procedure merge(a,b:integer);

var

i:integer;

begin

for i:=1 to n do

if set1[i]=b then set1[i]:=a;

end;

procedure init;

var

a,b:integer;

begin

readln(n,m,p);

fillchar(set1,sizeof(set1),0);

for i:=1 to n do

set1[i]:=i;

for i:=1 to m do

begin

readln(a,b);

merge(a,b);

end;

end;

var

a,b:integer;

begin

init;

for i:=1 to p do

begin

readln(a,b);

if find(a)=find(b) then

writeln('Yes') else writeln('No');

end;

end.

1 条评论

  • @ 2009-06-13 21:25:19

    。。。。

    。首先有一个很明显的错误。。

    比如说

    这个数据

    (以下直接是亲属关系)

    1 2

    2 3

    按照你的程序,在读入第1组的时候后

    set[1] = 1 set[2] = 1 set[3] = 3

    读入第2组后

    set[1] = 1 set[2] = 1 set[3] = 2

    所以在判断1和3的亲属关系的时候就会出错。

    其次你的程序时间效率太低,写并查集吧~很短。

  • 1

信息

ID
1034
难度
4
分类
数据结构 | 并查集 点击显示
标签
(无)
递交数
9368
已通过
3839
通过率
41%
被复制
15
上传者