题目描述

对于一个路径覆盖会有两个性质:

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题]最小路径覆盖问题相关推荐

  1. 网络流24题 最小路径覆盖问题

    Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...

  2. 最大流 ---- 最小路径覆盖 ---- P2765魔术球问题(网络流24题)

    题目链接 解题思路: 这题题目看起来根本不像网络流但是确实用网络流做的 这个题目有两个限制 每个柱子上面的球相邻两个的和必须是平方数 球的编号必须是连续的 首先我们只考虑第一个条件的话,我们怎么转化成 ...

  3. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  4. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...

  5. 【网络流24题】最小路径覆盖问题

    [题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...

  6. 流网络的最小割问题c语言,「网络流24题」最小路径覆盖问题

    Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...

  7. 【网络流24题】解题报告:C、最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)

    C.最小路径覆盖问题(有向无环图最小路径覆盖)(最大流)[省选/NOI- ] 拆点最大流 [问题分析] 有向无环图最小路径覆盖,可以转化成二分图最大匹配问题,从而用最大流解决. [建模方法] 构造二分 ...

  8. 网络流24题——魔术球问题(有向无环图最小路径覆盖)

    链接:https://www.oj.swust.edu.cn/oj/problem/show/1739 分析: 有向无环图最小路径覆盖:给定有向无环图,求一个路径划分,使得每个点在且只在一条路径上,路 ...

  9. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

最新文章

  1. 洛谷P1613 跑路
  2. 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普
  3. C++STL总结笔记(二)——仿函数(函数对象)
  4. 可展开的UITableViewCell
  5. 智慧食堂管理系统打造健康食堂新理念
  6. WPS Office Pro 2016 专业版
  7. CactiEZ-优化操作
  8. ubuntu安装Google输入法
  9. java 转16进制_java中进制的转换,Byte与16进制的转换方法
  10. 【南宋】【文天祥】正气歌
  11. python中的head函数_Pandas DataFrame.head()用法例子
  12. Android proguard 详解(一)
  13. visual studio mfc 界面 布局调整
  14. PowerDesign提示未安装打印机
  15. Scrapy爬虫框架视频学习
  16. 各种压缩算法的压缩效率,时间、压缩比等比较
  17. 【电子技术综合设计】数字钟(包含计数模块、12/24进制切换模块以及闹钟模块)
  18. 高斯—赛德尔(Gauss - Seidel)迭代法解线性方程组(Matlab程序)
  19. linux屏幕录像的方案
  20. 分支限界法经典问题——FIFO、LIFO、LC、带时限的作业排序、15谜问题

热门文章

  1. 《HTTP权威指南》– 5.Web服务器
  2. 系统性能检测工具之lsof
  3. 【转载】RHEL系统crontab计划任务管理
  4. 深入理解C/C++二维数组
  5. 关于Two pointers的个人理解
  6. 敲诈勒索比特币不断,企业用户如何防“山寨”钓鱼邮件
  7. 死在“风口上的猪”人工智能初创企业倒闭的原因分析
  8. django ForeignKey的使用
  9. linux中fork, source和exec的区别
  10. Android 屏幕滑动事件