pku 1182 食物链(并查集扩展)

 

A,B,C 三种物种 , 但因为给定的 N 个动物之间的关系是相对的,我们没办法只用三个集来表示 N 个动物所属的物种。网上都说这题是用并查集做的,其实这题并没有集合的概念,大部分人只是借鉴了并查集的数据结构及操作。

我的思路是这样的,用树来存储各动物间的相互关系。结点有两个域, parentflagparent 的作用大家都知道,这里 flag 用来表示子节点和父节点的关系, flag 为真表示父节点吃子节点, flag 为假表示父节点和子节点是同类。舍弃 rank 是因为编码麻烦,不想写。)给定一个动物编号,通过 flag 往上递推,我们可以得到该动物和其所在树的根节点动物之间的关系。于是给定不在同一棵树的 两个 动物的编号和关系,我们可以得到这两棵树的根结点动物见的关系,这样就可以在合并的时候选择恰当的方式。每读入一句话,如果两个动物处在不同的树,那么这句话肯定是真的,并且又得到了一个相对关系,我们可以合并他们所在的树。如果两个动物处在相同的树,我们则可以根据他们跟树根动物的关系来得到他们之间的关系,以此判断话的真假。

 

这种方法在内存使用上有点优势,但速度稍微有点慢,要 200ms 。如果你会更快的算法,请告诉我。

 

还有通过做这题,我才明白 (-5)%3=-2(我原来以为会是1),因为这个,我白送了3次WA。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值