Description

问题描述:

给定有向图G=(V,E)。设P 是G 的一个简单路(顶点不相交)的集合。如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖。P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0。G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖。设计一个有效算法求一个有向无环图G 的最小路径覆盖。

编程任务:

对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖。

Input Format

文件第1 行有2个正整数n和m。n是给定有向无环图G 的顶点数,m是G 的边数。接下来的m行,每行有2 个正整数i和j,表示一条有向边(i,j)。

Output Format

从第1 行开始,每行输出一条路径(行末无空格)。文件的最后一行是最少路径数。

输入样例#1:

11 12
1 2
1 3
1 4
2 5
3 6
4 7
5 8
6 9
7 10
8 11
9 11
10 11

输出样例#1:

1 4 7 10 11
2 5 8
3 6 9
3

有点逆向思考的感觉最差情况所有的点都是一条路径两个点连起来的话就少一条路径一个点拆成入点X和出点Y,构成二分图,ans=n-最大匹配数

关于打印:最大流中流量为1的边就是匹配边,先处理to[i],从ind[i]==0的点开始打印
//
//  main.cpp
//  wang24.3
//
//  Created by Candy on 29/11/2016.
//  Copyright © 2016 Candy. All rights reserved.
//

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2005,M=1e6,INF=1e9;
int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}
int n,m,s,t,u,v;
struct edge{int v,ne,c,f;
}e[M<<1];
int cnt,h[N];
inline void ins(int u,int v,int c){cnt++;e[cnt].v=v;e[cnt].c=c;e[cnt].f=0;e[cnt].ne=h[u];h[u]=cnt;cnt++;e[cnt].v=u;e[cnt].c=0;e[cnt].f=0;e[cnt].ne=h[v];h[v]=cnt;
}
int vis[N],d[N],q[N],head=1,tail=1;
bool bfs(){memset(vis,0,sizeof(vis));memset(d,0,sizeof(d));head=tail=1;q[tail++]=s;d[s]=0;vis[s]=1;while(head!=tail){int u=q[head++];for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(!vis[v]&&e[i].c>e[i].f){vis[v]=1;d[v]=d[u]+1;q[tail++]=v;if(v==t) return true;}}}return false;
}
int cur[N];
int dfs(int u,int a){if(u==t||a==0) return a;int flow=0,f;for(int &i=cur[u];i;i=e[i].ne){int v=e[i].v;if(d[v]==d[u]+1&&(f=dfs(v,min(a,e[i].c-e[i].f)))>0){flow+=f;e[i].f+=f;e[((i-1)^1)+1].f-=f;a-=f;if(a==0) break;}}return flow;
}
int dinic(){int flow=0;while(bfs()){for(int i=s;i<=t;i++) cur[i]=h[i];flow+=dfs(s,INF);}return flow;
}
int to[N],ind[N];
void print(){for(int u=1;u<=n;u++)for(int i=h[u];i;i=e[i].ne){int v=e[i].v;if(e[i].c==1&&e[i].f==1) to[u]=v-n,ind[v-n]++;}for(int i=1;i<=n;i++) if(!ind[i]){int u=i;while(u!=0) printf("%d ",u),u=to[u];putchar('\n');}
}
int main(int argc, const char * argv[]) {n=read();m=read();s=0;t=n+n+1;for(int i=1;i<=m;i++){u=read();v=read();ins(u,n+v,1);}for(int i=1;i<=n;i++) ins(s,i,1),ins(n+i,t,1);int ans=n-dinic();print();printf("%d",ans);return 0;
}

网络流24题 最小路径覆盖问题相关推荐

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

    题目描述 对于一个路径覆盖会有两个性质: 1.每个点属于且只属于一条路径: 2.在每条路径中,除终点外,每个点只有一条边可以通向路径中的另外一个点. 所以可以把每个点拆成两个点,一个是起始点,一个是目 ...

  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. 2019年的人工智能,那些吹过的牛能实现吗?
  2. webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)
  3. SQL Server使用视图做权限控制
  4. Docker(五)如何构建Dockerfile
  5. scrollHeight、clientHeight、offsetHeight、scrollTop等的定义以及图解
  6. python中自动化办公 【笔记】
  7. 使用IntelliJ IDEA和Maven管理搭建+Web+Tomcat开发环境
  8. java innodb存储引擎_InnoDB存储引擎简介
  9. mybatis批量删除和插入
  10. Apache Solr 未授权上传(RCE)漏洞(CVE-2020-13957)的原理分析与验证
  11. RK30SDK系统重启源码分析
  12. 2006年 上半年 网络管理员 下午试卷
  13. Linux进程的管理与调度(一)--- Linux进程描述符task_struct结构体详解
  14. 计算机软件税负率,2015最新增值税税负对照表
  15. 淘宝人群标签时效时间 精准淘宝人群标签方法
  16. 好看的typecho心情说说主题模板 记录生活日记
  17. 网站速度和性能测试工具
  18. 哈工大校园网极路由设置-寝室校园网路由器拓展
  19. 小资金超短线如何实现快速翻倍?
  20. java苹果通知V2新版协议实现订阅退款

热门文章

  1. mysql中的事物处理
  2. 8.4. Socket 方式
  3. MODULE_DEVICE_TABLE【转】
  4. Sysprep命令详解
  5. RHELServer6.2下编译GDAL和mysql和proj4支持
  6. 数据层(DAL)自动生成库
  7. 东芝复印机2303出现f070_东芝复印机维修代码大全
  8. ios与android设备即时语音互通的录音格式预研说明
  9. 区块链软件:区块链的迅猛发展
  10. 阿里云、天津开启多项合作,区域经济大脑落地津南