cf659 Round #346 Div2-E【DSU+判环】

Date:2022.01.18
题意:n个点m条边,每两点之间至多有一条边,开始是无向的,现在要变成有向的,并定义所有入度为0的城市为“分离”的,求最少的分离的城市有多少个。
在这里插入图片描述
思路:首先若干个连通的城市一定是有向图中的一个连通块,经过模拟,发现只要这个连通块中总边数>=总点数即可根据改变某些边的方向从而让每个点都不“分离”,又因为每两个点之间至多一条单向边,因此若这个连通块中总边数>=总点数那么它一定存在环。因此核心任务是判每个连通块中是否有环,有环对答案无贡献,无环贡献为1。此外,这里学到了一招用DSU判环,原理也很简单,用DSU将图分成若干连通块再方便不过了,之前只知道DSU可以记录每个连通块的点个数,其实判环原理也基本如下,将每个“点权”初始化为1,加边时不论是否两点已在一个连通块中,都把当前连通块的点权之和叠加到祖宗结点的点权之和中,若此连通块不含环则最终连通块中点数一定==总点权,否则必不相等。
代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值