欢迎访问~原文出处——博客园-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 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法的更多相关文章

  1. select 函数实现 三种拓扑结构 n个客户端的异步通信 (完全图+线性链表+无环图)

    一.这里只介绍简单的三个客户端异步通信(完全图拓扑结构) //建立管道 mkfifo open顺序: cl1 读 , cl2 cl3 向 cl1写 cl2 读 , cl1 cl3 向 cl2写 cl3 ...

  2. [洛谷P3386] [模板] 二分图匹配 (匈牙利算法)

    题目传送门 毒瘤出题人zzk出了个二分图匹配的题(18.10.04模拟赛T2),逼我来学二分图匹配. 网络流什么的llx讲完之后有点懵,还是匈牙利比较好理解(绿与被绿). 对于左边的点一个一个匹配,记 ...

  3. 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题

    Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...

  4. 【最大流/二分图匹配】【网络流24题】【P3254】 圆桌问题

    Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...

  5. cogs 14. [网络流24题] 搭配飞行员 二分图最大匹配 匈牙利算法

    14. [网络流24题] 搭配飞行员 ★★   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有 ...

  6. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

  7. 经典网络流题目模板(P3376 + P2756 + P3381 : 最大流 + 二分图匹配 + 最小费用最大流)

    题目来源 P3376 [模板]网络最大流 P2756 飞行员配对方案问题 P3381 [模板]最小费用最大流 最大流 最大流问题是网络流的经典类型之一,用处广泛,个人认为网络流问题最具特点的操作就是建 ...

  8. 网络流24(san)题题解汇总

    开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...

  9. cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)

    又打了一遍AC自动稽. 海星. 好像是第一次打trie图,很久以前就听闻这个思想了.OrzYYB~ // It is made by XZZ #include<cstdio> #inclu ...

随机推荐

  1. FastReport使用List的方法

    public class User { string username; string password; public User(string username, string password) ...

  2. 二、ARM处理器

    2.1 介绍 ARM核心的基本结构指ARM架构显示处理器中处理的数据大小.指令架构.寄存器等的结构和运行原理 ARM核心是利用ARM架构的基本原理实现的处理器核心部分. ARM的主要架构如下: ARM ...

  3. sql 行变列

    select * from market//查看原来所有数据 //第一种方式 select max(case area when '南京' then num else 0 end) 南京, max(c ...

  4. JavaScript之从浏览器一键获取教务处个人课程信息【插件】

    由于博主的个人网站(:http://www.johnnyzen.cn/),每学期都需要更新呈现课程的静态信息,由于课程量多,而且手动爬取很冗杂,特别想自动化实现.这不,今天终于有点时间了,把之前写no ...

  5. C static struct

    参考链接:  http://blog.csdn.net/keyeagle/article/details/6708077/ NOTICE: 静态全局变量 与 普通的全局变量的区别   static 全 ...

  6. tcp的连接断开

    tcp的断开连接是需要主机完成四次挥手的过程的,并不是断网了就表示断开连接了.假如双方已经建立起了连接,突然一方断网(比如突然停电,或者网线突然被拔了),对于另一方来讲他并不会知道这个情况,他依然认为 ...

  7. Androidstudio中jar包重复或jar包里的类重复问题

    https://www.jianshu.com/p/dd5d4fda1df8 http://blog.csdn.net/hqb112233/article/details/51514208

  8. python模块分析之typing(三)

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

  9. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  10. mysql授权报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    授权用户时报错,ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 原因为其实与val ...