Description
秤是由秤杆、绳、和物品组成,每个秤杆被一根连着中点处的绳子挂着,杆子的两端也都挂着一根绳子,下面可以直接挂物品,也可以挂另一个秤杆,秤杆可以任意旋转。
现在给你两把秤,要求判断这两把秤是否一样。秤的表示方法如下,假设秤一共有N个秤杆,用1到N来编号,1号秤杆总是最上面的那个秤杆,每个秤杆两边悬挂物品或者是另一个秤杆,物品用一个负数或0来表示物品的种类(-9999..0),而用正数表示悬挂的秤杆的编号。
Input
输入包含两把秤的描述,秤的描述方法如下:第一行输入一个整数N(1<=N<=100,000)表示秤中秤杆的数量,接下来N行,每行两个整数,表示第i个秤杆两边悬挂的情况。
Output
如果两把秤不同输出“Fred and Mary have different mobiles.”,否则输出“Fred and Mary might have the same mobile.”。
Sample Input&Sample output
5
2 3
4 5
-1 -2
-3 -4
-5 -6
5
2 5
-1 -2
-3 -4
-5 -6
3 4
Fred and Mary might have the same mobile.
5
2 3
4 5
-3 -4
-1 -2
-5 -6
5
2 5
-1 -2
-3 -4
-5 -6
3 4
Fred and Mary have different mobiles.
算法讨论
可以看做判断两棵树的每一个节点下放的东西是否相同。可用递归实现:
x,y分别为两棵树的第x个节点和第y个节点,共有3中情况
(1)都为物体,两棵树共4个,分为两种情况两两比较,满足一种情况返回true,否则false
(2)一个物体和一个节点,满足物体相同且递归两个节点返回true才返回true
(3)都为节点,与同1同理,两两递归,满足其一即可
var
a:array[-10000..0] of longint;
x,y,xx,yy:array[1..110000] of longint;
n,m,i:longint;
procedure dg(c,v:longint);
begin
if c<0 then
a[c]:=v
else
begin
dg(x[c],v+1);
dg(xx[c],v+1);
end;
end;
procedure gd(c,v:longint);
begin
if c<0 then
begin
if a[c]<>v then
begin
writeln('Fred and Mary have different mobiles.');
halt;
end;
end
else
begin
gd(y[c],v+1);
gd(yy[c],v+1);
end;
end;
begin
readln(n);
for i:=1 to n do
readln(x[i],xx[i]);
readln(m);
for i:=1 to m do
readln(y[i],yy[i]);
dg(1,1);
gd(1,1);
writeln('Fred and Mary might have the same mobile');
end.