Codeforces 22E(图论)

题意:

给出n个节点,以及和这个节点指向的节点fi,表示从i能够到达fi,问至少需要添加多少条边能够使得原图变为强连通分量,

输出边数及添加的边,多解输出任意一组解。

2 <= n <= 1e5, 1 <= fi <= n && i != fi。

分析:

注意隐含条件,每个点只有一条出边

所以对于每个连通分量来说,一定是一个有向环上挂着几个有向树

如果只有一个连通分量,那么直接从环上任意一点去连所有的入度为0的点即可

但现在有多个连通分量,先要把连成一个连通分量

我们把k个连通分量排成一排,把前面一个连通分量环上的一个点指向后一个连通分量的一个入度为0的点,形成循环,最后再把某个环上的点指向所有入度为0的点即可

具体操作的时候,重要的是分出连通分量和存下每个连通分量的环上的一个点

对于每个点dfs(i),并且color[u]=color[son]

什么时候会产生新的连通分量呢?就是遇见了一个节点已经访问过了并且这个节点没染色,那么就染色并递归回去,同时这个点一定是新的连通分量上环上的一点,将这个点设为新的联通分量环上的代表节点即可

 

转载于:https://www.cnblogs.com/wmrv587/p/7028449.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值