【强连通分量】CEOI2012network

题目描述:

给出一个有向图。
对图中某两个点p,q定义p到达q是指:从p出发,不经过相同的点,到达q有且仅有一条路径。
现在保证有一个点R,可以到达所有点。(输入数据保证合法)
第一问:求出每个点能到达的点的个数(包括自身)
第二问:求至少添加多少条边,可以使图中任何一个点都能到达所有点。
(这里的到达,同样满足上面的描述)
并且输出这些边(special judge)


分析

首先,很容易想到把强连通分量缩成点,由于R点的存在,使得缩完点后的图一定为一棵树(只有一个点入度为0,且没有环)。
第一问很简单,在树上遍历一遍就有答案了。
第二问相对就有点分析难度了。
首先,这个图一定只由反祖边和树边构成。
现在我们在缩完点后,假设一个点对(a,b)为了方便起见,我们还假定a为b的祖先。
这样显然从a可以走到b,且有唯一路径,但现在要b能走到a,就必须连返祖边,如果有多条路径,就说明返祖边一定有多条,那么从a到b之间的路径,就会同时出现在两个环中。
另外的,如果a和b没有祖先关系,因为不存在横插边,所以a只能先到a,b的某一个公共祖先处,可以看做把a转移成b的祖先,这样又转化为上面的情况了。
所以我们得出结论,如果存在一条边,同时出现在多个环中,那么就有多条路径存在。

接着就是找出最少的边数了。
很显然,在原图中,每个叶子节点都必须连向它的某个祖先,而且从这个祖先到达这个叶子节点,一定不会经过缩环形成的点(除非从边上擦过去,见图示)
这里写图片描述
而且,一个点如果有多个儿子,那么只有一个可以连接到它上方,其余都只能连接到它。实现过程并不困难,我的实现方式是记录每个点连向缩点后图的父亲的那条边,在原图中的真实边记录下来,这样就可以方便地完成将一个强连通分量连向它的某个祖先这种操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值