[网络流24题]最小路径覆盖问题
题目描述
对于一个路径覆盖会有两个性质:
1.每个点属于且只属于一条路径;
2.在每条路径中,除终点外,每个点只有一条边可以通向路径中的另外一个点。
所以可以把每个点拆成两个点,一个是起始点,一个是目标点,建立二分图模型。
二分图中的任何一种匹配都对应着一种路径覆盖方案。
若匹配数为零,那么路径数=总点数,每增加一个匹配,就会减少一条路径,所以有
最小路径覆盖数=总点数-最大匹配数
再在匹配过程中记录路径最后输出即可。
#include<complex> #include<cstdio> using namespace std; const int INF=0x3f3f3f3f; const int N=401,M=6007; struct node{int v,f,nxt; }e[M<<1]; int n,m,Enum=1,s,t,ans; int front[N],cur[N],deep[N],path[N]; int q[N]; bool vis[N]; int qread() {int x=0;char ch=getchar();while(ch<'0' || ch>'9')ch=getchar();while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}return x; } void Insert(int u,int v) {e[++Enum].v=v;e[Enum].f=1;e[Enum].nxt=front[u];front[u]=Enum;e[++Enum].v=u;e[Enum].nxt=front[v];front[v]=Enum; } bool bfs() {for(int i=0;i<=t;i++){deep[i]=0;cur[i]=front[i];}int head=1,tail=0,u,v;deep[s]=1;q[++tail]=s;while(head<=tail){u=q[head++];for(int i=front[u];i;i=e[i].nxt){v=e[i].v;if(!deep[v] && e[i].f){deep[v]=deep[u]+1;if(v==t)return 1;q[++tail]=v;}}}return 0; } int dfs(int x,int cur_flow) {if(x==t)return cur_flow;int rest=cur_flow,v;for(int &i=cur[x];i;i=e[i].nxt){v=e[i].v;if(deep[v]==deep[x]+1 && e[i].f && rest){int new_flow=dfs(v,min(e[i].f,rest));e[i].f-=new_flow;e[i^1].f+=new_flow;rest-=new_flow;if(new_flow)path[x]=v-n;if(!rest)return cur_flow;}}deep[x]=0;return cur_flow-rest; } void Dinic() {while(bfs())ans+=dfs(s,INF); } void print(int x) {if(!x)return;printf("%d ",x);vis[x]=1;print(path[x]); } int main() {scanf("%d%d",&n,&m);s=0;t=n+n+1;int u,v;for(int i=1;i<=m;i++){u=qread();v=qread();Insert(u,v+n);}for(int i=1;i<=n;i++){Insert(s,i);Insert(i+n,t);}Dinic();for(int i=1;i<=n;i++)if(!vis[i]){print(i);puts("");}printf("%d\n",n-ans);return 0; }
转载于:https://www.cnblogs.com/LeTri/p/8757649.html
[网络流24题]最小路径覆盖问题相关推荐
- 网络流24题 最小路径覆盖问题
Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...
- 最大流 ---- 最小路径覆盖 ---- P2765魔术球问题(网络流24题)
题目链接 解题思路: 这题题目看起来根本不像网络流但是确实用网络流做的 这个题目有两个限制 每个柱子上面的球相邻两个的和必须是平方数 球的编号必须是连续的 首先我们只考虑第一个条件的话,我们怎么转化成 ...
- 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)
D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...
- 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...
[题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...
- 【网络流24题】最小路径覆盖问题
[题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...
- 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题
Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...
- 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)
C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...
- 网络流24题——魔术球问题(有向无环图最小路径覆盖)
链接:https://www.oj.swust.edu.cn/oj/problem/show/1739 分析: 有向无环图最小路径覆盖:给定有向无环图,求一个路径划分,使得每个点在且只在一条路径上,路 ...
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
«问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...
最新文章
- 洛谷P1613 跑路
- 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普
- C++STL总结笔记(二)——仿函数(函数对象)
- 可展开的UITableViewCell
- 智慧食堂管理系统打造健康食堂新理念
- WPS Office Pro 2016 专业版
- CactiEZ-优化操作
- ubuntu安装Google输入法
- java 转16进制_java中进制的转换,Byte与16进制的转换方法
- 【南宋】【文天祥】正气歌
- python中的head函数_Pandas DataFrame.head()用法例子
- Android proguard 详解(一)
- visual studio mfc 界面 布局调整
- PowerDesign提示未安装打印机
- Scrapy爬虫框架视频学习
- 各种压缩算法的压缩效率,时间、压缩比等比较
- 【电子技术综合设计】数字钟(包含计数模块、12/24进制切换模块以及闹钟模块)
- 高斯—赛德尔(Gauss - Seidel)迭代法解线性方程组(Matlab程序)
- linux屏幕录像的方案
- 分支限界法经典问题——FIFO、LIFO、LC、带时限的作业排序、15谜问题