代码
var n,m,p,i,a,b:integer;
f:array[1..5000] of integer;
function link(x:integer):integer;
var i:integer;
begin
if f[x]=x then link:=x
else link:=link(f[x]);
end;
begin
assign(input,'friend.in');reset(input);
assign(output,'friend.out');rewrite(output);
readln(n,m,p);
for i:=1 to n do f[i]:=i;
for i:=1 to m do
begin
readln(a,b);
if link(a)<>link(b) then f[link(a)]:=b;
end;
for i:=1 to p do
begin
readln(a,b);
if link(a)=link(b) then writeln('Yes')
else writeln('No');
end;
close(input);close(output);
end.
友好关系(friend)
描述 Description
虽然天使之间的关系大多是友好的,但是由于天使的生命都太漫长了,难免会因为鸡毛蒜皮的小事发生矛盾,产生芥蒂。如果天使之间的关系不好,他们共同作战时的战斗力就会大大减弱。为了使队伍的战斗力达到最大,提高赢得神战的几率,队长米迦勒必须要知道任意两个天使之间是否友好。
我们规定:x和y关系友好,y和z关系友好,那么x和z的关系也是友好的。且天使之间只有友好与不友好两种关系。
现在给出天使间的友好关系,米迦勒将会询问你任意两个天使间的关系。请编写程序解决这个问题。
输入格式 Input Format
第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个友好关系,询问p对天使的关系。
以下m行:每行两个数 a,b。表示a与b的关系友好。
接下来p行:每行两个数c,d。询问c与d的关系是否友好。
输出格式 Output Format
p行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”友好关系。
样例输入 Sample Input
6 5 3
1 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
样例输出 Sample Output
Yes
Yes
No
思路:
一维数组模拟树结构,下标代表结点第i个人,数组元素代表父结点,如果父结点等于本身那么此节点就是树的根。
初始时每个结点的父结点都是本身,每个结点单独为一棵树。
将有友好关系的都放在同一棵树里。
读入人员关系,判断是否在同一棵树里,(判断依据就是结点所在树的根结点相同),如果不是则将他们放入同一棵树里(将第一个人所处树的根结点的指向第二个人)。