##无向图
###概念
对于无向图来说,两点的连通的特殊情况有两种:点双连通、边双连通。
我们先引入割点和割桥的概念:
- 割点:删去此点后图不连通;
- 割边:删去此边后图不连通。
那么双连通关系就很好解释了:
- 点双连通:两点之间的路径不存在割点;
- 边双连通:两点之间的路径不存在割桥。
然而只是知道两点的关系并无大用,我们常常需要知道一些点集的关系:
- 点双连通分量(Bi-connected Component, bcc):任意两点都双连通的极大点集。割点可能属于多个点双连通分量,但一条边只属于一个。
- 边双连通分量(Edge Bi-connected Component, ebc):任意两点都双连通的极大点集。
求法
首先明确求解图的连通性问题的基本方法:以 DFS 为基础,纪录每个点的 DFS 顺序 dfn
和这个点在 DFS 树中后代的 DFS序最小值 low
。
我们先考虑割点、割边的求法,割点的话只要保证后代节点与前代节点没有连边,且此节点不是树根;如若割点只有一个后代,则割点和后代的连边就是割边。
求出割点割边之后,双连通分量就好求了:
- 对于边双连通分量,我们只要保证其中没有割边即可,那就以割边为界把总点集分割成多个部分;
- 而点双不能简单地划分点,应将边入栈,划分边集,然后在算出对应的点集。
BCC:
1 |
|
EBC:
1 |
|
[LA3523] Knights of the Round Table
有 $n$ 个圆桌骑士,每次圆桌会议至少引诱 $3$ 哥其实参加。且相互憎恨的骑士不能相邻。由于会议需要表决,故参加的人数必须为奇数。现在知道哪些骑士相互憎恨,统计有多少个骑士不可能参加同一会议。
$n\leq1000,m\leq10^6$
其实就是求一无向图内不在一简单奇圈内的点数。
这道题牵扯到无向图中常见的套路:按照点双连通分量是否二分图分类讨论。那么对于这道题,需要用到这样一个结论:如果点双不是二分图,那么它一定包含奇圈,且所有点都在某一及奇圈内。
那么只要找出并统计一下即可。
1 |
|
###[LA5135] Mining Your Own Business [Wolrd Finals2011]
在无向图上选择尽量少的点涂黑,使得任意删除一个点后每个点双连通分量至少有一个黑点。
$n\leq5\times10^4$
把割点涂黑是不划算的,因为万一割点被删去了,直接 GG
在一个点双中一个黑点就够了
1 |
|
##有向图
时间复杂度为$O(N+M)$。
1 | struct E{int from,to,next;} e[MAXM+1];int ecnt,G[MAXN+1]; |
###[USACO5.3] Network_of_Schools
Tarjan的简单应用
由于所点后续操作十分简单,我们没必要再费内存建另一张缩过点后的图,只需统计缩过后的每一个点的入度与出度。
由于所有入度为零的学校必须得到真传才可以,故A问题的答案即为所有入度为零的点;对于B问题,不仅需要入度为零的点得到真传,还要保证所有点都能肩负起传给其他所有学校的历史重任,即所有点的出度都不能为零。
事实上,只要上述一个条件满足,则另一个条件一定满足(因为只要一个条件满足,那么这张缩过点的图也变成一张连通图了)。故B问题的答案即为入度为零的点数和出度为零的点数两者的最大值。
有一点需要注意,如果最后缩成一个点,需要进行特殊处理。
1 | /* |
###[HAOI2006] 受欢迎的牛
这道题更水了,不过因为是本省省选真题,还是说一下:
很明显首先需要缩点,所完点后每一个强联通分量里的牛形成一个命运共同体,也就是说只要缩完后的点是受欢迎的,那么这里边所有的牛都是,我们想到要存一下每一个命运共同体里的牛的数量。
接下来,我们注意到当且仅当缩完后的点中有且只有一个点的出度为零时,这个点中的牛是受欢迎的(如果有两个这样的点,那么整张图就不存在受欢迎的牛),而答案就是这个点中牛的数目。
代码依然不长,在省选中实为送分题
1 |
|
这道题难道是传说中的依赖背包?我也不清楚。不过很明显的是一定要先用tarjan缩点,然后再跑树上背包。这里有一个技巧,为了成功地跑树上背包,我们将一个超级源点连接到所有入度为零的点,把森林建成一棵树,这样答案就在源点上了。
1 |
|