![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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个人,数组元素代表父结点,如果父结点等于本身那么此节点就是树的根。
初始时每个结点的父结点都是本身,每个结点单独为一棵树。
将有友好关系的都放在同一棵树里。
读入人员关系,判断是否在同一棵树里,(判断依据就是结点所在树的根结点相同),如果不是则将他们放入同一棵树里(将第一个人所处树的根结点的指向第二个人)。