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

该博客介绍了如何利用图论和数据结构解决一个问题:在确保每两点间最多有一条边的情况下,将无向图转换为有向图,并最小化分离(入度为0)的城市数量。通过DSU(Disjoint Set Union)算法判断图中的连通块是否存在环,如果存在环,则连通块不会增加分离城市,反之则会。博主分享了DSU判环的原理和实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int N = 2e5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值