友好关系(friend)

代码
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个人,数组元素代表父结点,如果父结点等于本身那么此节点就是树的根。

初始时每个结点的父结点都是本身,每个结点单独为一棵树。

将有友好关系的都放在同一棵树里。

读入人员关系,判断是否在同一棵树里,(判断依据就是结点所在树的根结点相同),如果不是则将他们放入同一棵树里(将第一个人所处树的根结点的指向第二个人)。

原文地址:https://www.cnblogs.com/nbalive2001/p/1874546.html