网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - CodeVS1904
题目传送门 - 洛谷2764
题意概括
给出一个有向无环图,现在请你求一些路径,这些路径覆盖且仅覆盖所有的点一次。
现在让你求最少要几条路径。
CodeVS1904 - 只需要输出几条边
洛谷2764 - 先输出路径,再输出几条。(但是截止2017-08-11,还没有SPJ)
题解
话说我这一题一开始在洛谷做,由于没有SPJ,多次爆零,据说在洛谷的那个数据只有网络流可以做?匈牙利挂了(因为没有SPJ)?
首先,我们把题目中的每一个点看成两个点。
对于一个点a, 我们把他看作x(出点,仅连出边)和y(入点,仅连入边)。
然后通过读入的边,构建新的图。
然后我们发现整个图是一个二分图。
那么就可以用匈牙利算法,求出最大匹配总数,然后用总点数减去它,就是答案。
为什么? 因为你选出的路径中,路径条数 = 总点数 - 选择的边的条数。(这个自己想想为什么吧,不解释)
然后二分图匹配数其实就是选择的边数,那么路径条数 = 总点数 - 选择的边数 = 总点数 - 二分图匹配的边数。
如果用网络流做,可以开一个源点和一个汇点,然后在之前的基础上,链接源点到x类点的边和y类点到汇点的边。洛谷没有SPJ,貌似只能用网络流做。
至于输出路径,我们可以任意确定点,然后向该点的对应点的匹配点和该点匹配点延伸,然后标记掉,找到所有点之后再输出;当然可能会有多条路径,所以这一步做完之后是不够的,我们得不停的找没有被标记的点,直到所有的点都被标记,那么路径就生成完毕了。具体实现可以参见我的第二份代码 - 洛谷2764
至于网络流 -> 可以看这个 -> 传送门
代码 - CodeVS1904
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- const int N=*+,M=N*N;
- struct Gragh{
- int cnt,x[M],y[M],nxt[M],fst[N];
- void set(){
- cnt=;
- memset(fst,,sizeof fst);
- }
- void add(int a,int b){
- cnt++;
- x[cnt]=a,y[cnt]=b;
- nxt[cnt]=fst[a],fst[a]=cnt;
- }
- }e;
- int n,m;
- int match[N],demat[N];
- bool vis[N];
- bool dfs(int x){
- for (int i=e.fst[x];i;i=e.nxt[i])
- if (!vis[e.y[i]]){
- vis[e.y[i]]=;
- if (match[e.y[i]]==-||dfs(match[e.y[i]])){
- match[e.y[i]]=x;
- return ;
- }
- }
- return ;
- }
- int q1[N],q2[N],zq1,zq2;
- int main(){
- scanf("%d%d",&n,&m);
- e.set();
- for (int i=;i<=m;i++){
- int x,y;
- scanf("%d%d",&x,&y);
- e.add(x,y+n);
- }
- int cnt=;
- memset(match,-,sizeof match);
- for (int i=;i<=n;i++){
- memset(vis,,sizeof vis);
- if (dfs(i))
- cnt++;
- }
- memset(demat,-,sizeof demat);
- for (int i=n+;i<=*n;i++)
- if (match[i]!=-)
- demat[match[i]]=i;
- memset(vis,,sizeof vis);
- printf("%d",n-cnt);
- return ;
- }
代码 - 洛谷2764 - 由于缺少SPJ而WA
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- const int N=*+,M=N*N;
- struct Gragh{
- int cnt,x[M],y[M],nxt[M],fst[N];
- void set(){
- cnt=;
- memset(fst,,sizeof fst);
- }
- void add(int a,int b){
- cnt++;
- x[cnt]=a,y[cnt]=b;
- nxt[cnt]=fst[a],fst[a]=cnt;
- }
- }e;
- int n,m;
- int match[N],demat[N];
- bool vis[N];
- bool dfs(int x){
- for (int i=e.fst[x];i;i=e.nxt[i])
- if (!vis[e.y[i]]){
- vis[e.y[i]]=;
- if (match[e.y[i]]==-||dfs(match[e.y[i]])){
- match[e.y[i]]=x;
- return ;
- }
- }
- return ;
- }
- int q1[N],q2[N],zq1,zq2;
- int main(){
- scanf("%d%d",&n,&m);
- e.set();
- for (int i=;i<=m;i++){
- int x,y;
- scanf("%d%d",&x,&y);
- e.add(x,y+n);
- }
- int cnt=;
- memset(match,-,sizeof match);
- for (int i=;i<=n;i++){
- memset(vis,,sizeof vis);
- if (dfs(i))
- cnt++;
- }
- memset(demat,-,sizeof demat);
- for (int i=n+;i<=*n;i++)
- if (match[i]!=-)
- demat[match[i]]=i;
- memset(vis,,sizeof vis);
- for (int i=;i<=n;i++){
- if (vis[i])
- continue;
- vis[i]=;
- zq1=zq2=;
- q1[]=q2[]=i;
- int x=i;
- while (demat[x]!=-)
- x=demat[x]-n,q1[++zq1]=x,vis[x]=;
- x=i;
- while (match[x+n]!=-)
- x=match[x+n],q2[++zq2]=x,vis[x]=;
- for (int j=zq2;j>=;j--)
- printf("%d ",q2[j]);
- for (int j=;j<=zq1;j++)
- printf("%d ",q1[j]);
- puts("");
- }
- printf("%d",n-cnt);
- return ;
- }
网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法的更多相关文章
- select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)
一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...
- [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)
题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- 【最大流/二分图匹配】【网络流24题】【P3254】 圆桌问题
Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...
- cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法
14. [网络流24题] 搭配飞行员 ★★ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有 ...
- 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)
洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\) \(10^9\) 的时代了吗?落伍了落伍了/ ...
- 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)
题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...
- 网络流24(san)题题解汇总
开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...
- cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)
又打了一遍AC自动稽. 海星. 好像是第一次打trie图,很久以前就听闻这个思想了.OrzYYB~ // It is made by XZZ #include<cstdio> #inclu ...
随机推荐
- mac系统如何在桌面新建文件(夹)
方法一:(终端方式,推荐) 1.在电脑上找到终端 2.指定你想要保存文件的路径,然后回车.例如桌面就是: cd desktop #或是 cd /Users/username/Desktop 有人问:假 ...
- QA系统Match-LSTM代码研读
QA系统Match-LSTM代码研读 背景 在QA模型中,Match-LSTM是较早提出的,使用Prt-Net边界模型.本文是对阅读其实现代码的总结.主要思路是对照着论文和代码,对论文中模型的关键结构 ...
- elasticsearch 基本配置
基本配置elasticsearch的config文件夹里面有两个配置文件:elasticsearch.yml .logging.yml.jvm.options 第一个是es的基本配置文件,第二个是日志 ...
- pandas数据表
安装 pip3 install pandas s=pd.Series([1,3,6,90,44,1]) #创建序列[用列表创建].数据源的维度必须是一维 #data 指定数据源 print(s ...
- 第18月第25天 github下载单个文件夹 git命令
1. 用 SVN 即可. 举例说明: 譬如这个项目: Mooophy/Cpp-Primer · GitHub, 我只想看 ch03 文件夹的代码怎么办? 先打开 ch03, 其 URL 为: &quo ...
- include的作用
#include发生在预处理阶段,整个编译链接过程,#include是最简单的了,没有之一.就是在include的位置直接把文件原原本本完完整整一字不落的包含进来,下面举一个极端点的例子: //fil ...
- DSO windowed optimization 代码 (1)
这里不想解释怎么 marginalize,什么是 First-Estimates Jacobian (FEJ).这里只看看代码,看看Hessian矩阵是怎么构造出来的. 1 优化流程 整个优化过程,也 ...
- SQL Server 备份还原
SQL Server支持三种备份方式 完全备份: 差异备份 事务日志备份 一般备份方式为,完全备份/每周,差异备份/每天,事务日志备份/按分钟计,这样可确保备份的高效性和可恢复性. 1. 完全备份 备 ...
- java删除文件及其目录
1.删除指定文件路径 public @ResponseBody String deleteFiles(HttpServletRequest request) { log.info(this.getCl ...
- 【ANT】ant使用
官网:https://ant.apache.org/,task介绍:https://ant.apache.org/manual/index.html 0.介绍: Ant的构建文件当开始一个新的项目时, ...