题意:给一张无向图,判断能否分成两个生成森林。

n≤2×103,m≤4×103n\leq 2\times 10^3,m\leq 4\times 10^3n≤2×103,m≤4×103

题目中这样的图称为“丛林”,下面以此来简称。

结论 一张图是丛林的充要条件是它的每一个子图 G=(∣V∣,∣E∣)G=(|V|,|E|)G=(∣V∣,∣E∣) 有 ∣E∣≤2∣V∣−2|E|\leq 2|V|-2∣E∣≤2∣V∣−2

必要性显然。

充分性:考虑归纳法,当 ∣V∣=1|V|=1∣V∣=1 时显然成立,∣V∣>1|V|>1∣V∣>1 假设结点数小于 ∣V∣|V|∣V∣ 的满足条件的图都是丛林。

引理1 定义满图为满足 ∣E∣=2∣V∣−2|E|=2|V|-2∣E∣=2∣V∣−2 的图,对于当前图的两个交非空的子图 G1=(V1,E1),G2=(V2,E2)G_1=(V_1,E_1),G_2=(V_2,E_2)G1​=(V1​,E1​),G2​=(V2​,E2​),它们的并也是满图。

证明 设它们的交为 G3=(V3,E3)G_3=(V_3,E_3)G3​=(V3​,E3​),并为 G=(V,E)G=(V,E)G=(V,E)。由假设知 ∣E1∣=2∣V1∣−2,∣E2∣=2∣V2∣−2,∣E3∣≤2∣V3∣−2|E_1|=2|V_1|-2,|E_2|=2|V_2|-2,|E_3|\leq 2|V_3|-2∣E1​∣=2∣V1​∣−2,∣E2​∣=2∣V2​∣−2,∣E3​∣≤2∣V3​∣−2,所以 ∣E∣≥2∣V∣−2|E|\geq 2|V|-2∣E∣≥2∣V∣−2。又因为 ∣E∣≤2∣V∣−2|E|\leq 2|V|-2∣E∣≤2∣V∣−2,所以 ∣E∣=2∣V∣−2|E|=2|V|-2∣E∣=2∣V∣−2。得证。

引理2 一个丛林最小的点度数小于 444。

证明 显然。

对于一张满足右边的条件的图,它的每一个真子图都是丛林。我们考虑它的一个最小的点的度数,如果是 0,1,20,1,20,1,2,就把这些边连到外面对应个数的生成森林上,得到整张图是丛林。下面讨论度数为 333 的情况。

引理3 当度数为 333 时,设相邻的三个点为 a,b,ca,b,ca,b,c,删掉这个点 uuu 及这三条边后的图为 GGG,那么一定存在 {x,y}⊆{a,b,c}\{x,y\}\subseteq \{a,b,c\}{x,y}⊆{a,b,c} 使得 GGG 中不存在一个满子图包含 x,yx,yx,y。

证明 假设 a,b,ca,b,ca,b,c 两两都被一个满子图包含,把这三个满子图合并起来,由引理 1,合并后的图 FFF 也是满子图,即 ∣E(F)∣=2∣V(F)∣−2|E(F)|=2|V(F)|-2∣E(F)∣=2∣V(F)∣−2。我们加入 uuu 和这三条边,就得到了一张 ∣E∣=2∣V∣−1|E|=2|V|-1∣E∣=2∣V∣−1 的图,它是原图的子图,矛盾,得证。

我们在 G1G_1G1​ 中加入一条边 (x,y)(x,y)(x,y),因为不存在包含 (x,y)(x,y)(x,y) 的满图,所以加入后 G1G_1G1​ 仍然是丛林。考虑这棵丛林的两棵生成树,在包含 (x,y)(x,y)(x,y) 的树上断掉这条边,然后 uuu 分别通过 x,yx,yx,y 连接两个连通分量,剩下一个直接连,就构造了两棵原图的生产树,原命题得证。


现在我们要判断是否对于每一个子图都有

∣E∣≤2∣V∣−2|E|\leq 2|V|-2∣E∣≤2∣V∣−2

∣E∣−2∣V∣≤−2|E|-2|V|\leq -2∣E∣−2∣V∣≤−2

就是最大权闭合子图对于每条边建一个点,从 SSS 连边权为 111 的边,向两个端点连 +∞+\infin+∞ 的边,每个点到 TTT 连边权为 222 的边,跑最小割即可。

设最小割为 ccc,边数为 mmm,我们需要判断是否

m−c≤−2m-c\leq -2m−c≤−2

然后你会发现至少有一个大小为 mmm 的割,所以会永远输出 No

冷静分析,这样的原因是空图的存在。所以我们要枚举一个点强制选,也就是断掉对应的边,最后最小割 +2+2+2,当 c−2<mc-2<mc−2<m 时输出 No

然后要跑 nnn 次完整的 dinic,会 T。注意到每次流量改变是常数,所以在断掉 (u,v)(u,v)(u,v) 时从 uuu 到 SSS 流 c(u,v)c(u,v)c(u,v) 的流量来模拟退流,然后物理断掉这条边。再从 SSS 到 TTT 跑 dinic,因为是在几乎已经增广完的残余网络上跑的所以很快。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <queue>
#define MAXN 6005
#define MAXM 40005
using namespace std;
const int INF=0x7fffffff;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
struct edge{int u,v,c;}e[MAXM];
int head[MAXN],cur[MAXN],nxt[MAXM],cnt=1;
inline void insert(int u,int v,int c){e[++cnt]=(edge){u,v,c};nxt[cnt]=head[u];head[u]=cnt;}
inline void addnode(int u,int v,int c){insert(u,v,c),insert(v,u,0);}
int dis[MAXN];
bool bfs(int S,int T)
{queue<int> q;q.push(T);memset(dis,-1,sizeof(dis));dis[T]=0;while (!q.empty()){int u=q.front();q.pop();for (int i=head[u];i;i=nxt[i])if (e[i^1].c&&dis[e[i].v]==-1){dis[e[i].v]=dis[u]+1;q.push(e[i].v);if (e[i].v==S) return true;}}return false;
}
int dfs(int u,int f,int T)
{if (u==T||!f) return f;int used=0;for (int& i=cur[u];i;i=nxt[i])if (e[i].c&&dis[u]==dis[e[i].v]+1){int w=dfs(e[i].v,min(e[i].c,f),T);e[i].c-=w,e[i^1].c+=w;f-=w,used+=w;if (!f) break;}if (!used) dis[u]=-1;return used;
}
inline int dinic(int S,int T,int f=INF)
{int ans=0;while (f>ans&&bfs(S,T))memcpy(cur,head,sizeof(head)),ans+=dfs(S,f-ans,T);return ans;
}
int pos[MAXN];
int solve()
{memset(head,0,sizeof(head));memset(nxt,0,sizeof(nxt));cnt=1;int n,m;n=read(),m=read();int S=n+m+1,T=S+1;for (int i=1;i<=m;i++){addnode(n+i,read(),INF);addnode(n+i,read(),INF);addnode(S,n+i,1);}for (int i=1;i<=n;i++) addnode(i,T,2),pos[i]=cnt;int ans=dinic(S,T);for (int i=1;i<=n;i++){int f=e[pos[i]].c;e[pos[i]].c=e[pos[i]^1].c=0;if (f) ans-=dinic(i,S,f);if (i>1) e[pos[i-1]^1].c=2;ans+=dinic(S,T);if (ans<m) return puts("No"),0;}puts("Yes");return 0;
}
int main()
{for (int T=read();T;T--) solve();return 0;
}

【UOJ168】元旦老人与丛林【图论证明】【最大权闭合子图】【dinic动态推流】相关推荐

  1. 图论 —— 网络流 —— 最小割 —— 最大权闭合子图

    [概述] 给出一个有向图,每一个点都有一个权值,现在要选择一个权值和最大的子图,使得每个点的后继都在子图中,这个子图就称为最大权闭合子图. 如上图,能选的子图有:Ø.{1,2,3,4,5,6}.{3, ...

  2. 最大权值闭合子图的证明详解

    前面定义部分转自这篇博客 网络流--最小割求最大权闭合子图 定义 有一个有向图,每一个点都有一个权值(可以为正或负或0),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合 ...

  3. 四色地图理论的图论证明

    四色地图理论的图论证明 四色地图理论我就不多说了,四色猜想与哥德巴赫猜想.费马定理成为了近代三大数学难题. 首先,大家看一个的图,平面中圆点标号1,2,3,4. 两两之间有连线.将平面切分为四个区域a ...

  4. kcl方程独立性的图论证明

    这是困惑了本人很久的问题,最近得闲,去b站观光了部分的离散数学课程并参考了一些资料,对这个问题做个总结,也算是笔记吧.电路原理和离散数学都还没学完,小白一只,各位如有发现任何错误,恳请指出. 支路电流 ...

  5. 图论证明:点连通度小于等于边连通度小于等于最小度

    先来引入该证明涉及到的相关概念: 最小度:无向图G中度数最小顶点的度数,记作 κ ( G ) \kappa(G) κ(G). 边连通度:为使图G不连通或成为平凡图,至少需要从G中删除的边的数量称作G的 ...

  6. [UOJ #167]【UR #11】元旦老人与汉诺塔

    题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$.$n,m\leqslant100$ 题解:首先可以知道的是,一个状态最多可以转移到其 ...

  7. 【UOJ 169】元旦老人与数列(线段树)

    目录 题目 分析 实现 题目 有两个长度为 n n n 的数列 A A A 和

  8. 对于最小割的进一步理解

    以前只知道最小割就是最大流...网络流背个模板,没了 根本没有深入理解,最近写了一些题才知道自己很 $naive$ 废话不多说,开始正题(假设大家都会网络流的代码,并且知道网络流在做什么) 首先最小割 ...

  9. 图论-网络流⑦-费用流解题

    图论-网络流⑦-费用流解题 上一篇:图论-网络流⑥-费用流 下一篇:图论-网络流⑧-有上下界的网络流 参考文献: https://www.luogu.com.cn/blog/user9012/solu ...

最新文章

  1. C语言的一个之前没有见过的特性
  2. spark学习13(spark RDD)
  3. 使用mail发送附件
  4. Gradle脚本基础全攻略
  5. [APIO2018]铁人两项——圆方树+树形DP
  6. (七)JS基础知识四(搞定异步)【三座大山之三,必考!!!】
  7. 定义域是取交集吗_高中数学;函数定义域秒解技巧(学好函数突破数学)
  8. 实用的 Python —— 使用虚拟环境 virtualenv(Linux)
  9. Python之抖音快手代码舞--字符舞
  10. 2011-9-11 凌晨00:46
  11. 决定员工发展命运的34条重要行为规范
  12. Mac上的全局翻译利器 : Bob + PopClip
  13. Excel在统计分析中的应用—第二章—描述性统计-Part5-峰度(峰值和矩峰度系数)
  14. 使用hardhat 开发以太坊智能合约-发布合约
  15. iOS第三方开源库的吐槽和备忘 - 王培
  16. sd敢达g世纪android,SD敢达G世纪 世界/超越世界 安卓模拟器金手指代码亲测有用...
  17. 网大网剧备案要避免的几大错误,内附最新备案流程!
  18. 人类又被AI碾压,这次是星际争霸
  19. 经典C语言算法之回文数
  20. [007]爬虫系列 | 猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie

热门文章

  1. 面对女人的喋喋不休时,男人内心的真实想法
  2. 我女朋友让我删前任,我明明删了她还是要分手...
  3. 普通人改变命运最关键的这几种方法
  4. 你对求生欲,一无所知!| 今日最佳
  5. 正态分布为什么常见?
  6. 允许服务与桌面交互_vivo 正式推出 Origin OS,融合自然设计与全新交互_搜狐汽车...
  7. mysql 常用权限_MySQL的权限有哪些
  8. php的old函数,laravel单元测试之phpUnit中old()函数报错解决
  9. linux truncate文件,linux系统编程:用truncate调整文件大小
  10. 数字图像处理王伟强_深度学习主导下,还有必要学数字图像处理?