jzoj1500 秤

22 篇文章 0 订阅
15 篇文章 0 订阅

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值