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