Sicily 1034. Forest

看了BBS上的题目分类说要DFS,但是听了舍友的建议,发现用一位数组存貌似也比较方便,所以就用了一位数组存。这个一位数组的元素是一个结构体,包括三个元素,fa、level、in分别表示父节点下标、当前节点层数、当前节点入度数。

首先要先考虑特殊情况,这一点其实样例中已经给出了,就是当m=0的时候,森林的深度为0,而其宽度为结点个数(因为都是根节点,我本来YY m=0时只会输出0 1...结果...)。读入时更新fa和in,当in>=2时用flg记录下来,表示已经出现“two edges pointing to the same node”。接下来要判断是否有环,这里是从当前结点往前推看是否能退出其自身就是自己的祖先,如果可以自然有环,其次,若已经向上退了n的结点还没有出现结点0或者前一种情况,则说明,有环使循环陷入死循环了。判断完了非法状态,现在就要计算森林深度和宽度,根据每个结点的fa项可以比较方便的推出(邻接矩阵貌似就比较麻烦处理了,但是前面非法状态的判断会容易些),再遍历每个节点,根据其所在的层更新width[]数组(该数组记录第i层上的元素),则所求即为max(width[i]),至此解决问题。

 

附上代码:

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值