网络流二十四题之三 —— 最小路径覆盖问题(PATH)
来源:互联网 发布:淘宝离线自动发货 编辑:程序博客网 时间:2024/06/08 10:59
最小路径覆盖问题
Description
给定有向图
设
如果
的路径覆盖。
设计一个有效算法求一个有向无环图
Input
第
接下来的
Output
从第
文件的最后一行是最少路径数。
Sample Input
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
Sample Output
1 4 7 10 11
2 5 8
3 6 9
3
Solution
设
每条边的容量均为
求网络
Code
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #define Min(x,y) ((x)<(y)?(x):(y))
- using namespace std;
- const int INF=0x3f3f3f3f;
- int m,n,s,t,cnt;
- int low[100000],head[100000],nxt[100000],data[100000];
- int dis[1000];
- bool vis[1000];
- queue<int>q;
- void add(int x,int y,int z){
- nxt[cnt]=head[x];data[cnt]=y;low[cnt]=z;head[x]=cnt++;
- nxt[cnt]=head[y];data[cnt]=x;low[cnt]=0;head[y]=cnt++;
- }
- bool BFS(){
- memset(dis,-1,sizeof dis);
- q.push(s);dis[s]=0;
- while(!q.empty()){
- int now=q.front();q.pop();
- for(int i=head[now];i!=-1;i=nxt[i])
- if(low[i]&&dis[data[i]]<0){dis[data[i]]=dis[now]+1;q.push(data[i]);}
- }
- return dis[t]>0;
- }
- int dfs(int now,int flow){
- if(now==t)return flow;
- int Flow;
- for(int i=head[now];i!=-1;i=nxt[i]){
- if(low[i]&&dis[data[i]]==dis[now]+1){
- if(Flow=dfs(data[i],Min(flow,low[i]))){
- low[i]-=Flow;
- low[i^1]+=Flow;
- return Flow;
- }
- }
- }
- return 0;
- }
- void dfs2(int now){
- vis[now]=true;
- printf(”%d ”,now);
- for(int i=head[now];i!=-1;i=nxt[i]){
- if(!vis[data[i]]&&data[i]!=s&&data[i]!=t&&data[i]>n&&data[i]<=n*2&&!low[i])dfs2(data[i]-n);
- }
- }
- int main(){
- freopen(”path.in”,“r”,stdin);
- freopen(”path.out”,“w”,stdout);
- scanf(”%d%d”,&n,&m);
- memset(head,-1,sizeof head);
- int weight=n;
- s=n+n+1,t=n+n+2;
- for(int i=1;i<=m;i++){
- int x,y;
- scanf(”%d%d”,&x,&y);
- add(x,y+n,1);
- }
- for(int i=1;i<=n;i++){add(s,i,1);add(i+n,t,1);}
- while(BFS()){
- int flag;
- while(flag=dfs(s,INF)){
- weight-=flag;
- }
- }
- for(int i=1;i<=n;i++)if(!vis[i]){
- dfs2(i);
- printf(”\n”);
- }
- printf(”%d\n”,weight);
- return 0;
- }
1 0
- 网络流二十四题之三 —— 最小路径覆盖问题(PATH)
- 【网络流二十四题 最小路径覆盖问题】【DAG 最小路径覆盖->最大流】
- 【网络流二十四题 魔术球问题】【DAG 最小路径覆盖->最大流】【灵感】
- 网络流24题——最小路径覆盖问题
- 网络流24题之T3——最小路径覆盖问题
- 网络流24题3最小路径覆盖问题(洛谷 P2764 最小路径覆盖问题)
- 最小路径覆盖问题[网络流24题之3]
- 线性规划与网络流24题の3 最小路径覆盖问题(最小路径覆盖)
- 网络流二十四题之二十四 —— 骑士共存问题(KNI)
- hihocoder1394网络流三之最小路径覆盖
- 网络流二十四题之十四 —— 孤岛营救问题(RESCUE)
- 网络流24题之最小路径覆盖问题(nefu481)
- [网络流24题] 03 最小路径覆盖问题(有向无环图最小路径覆盖,网络最大流)
- 线性规划与网络流24题——03最小路径覆盖问题
- 最小路径覆盖问题 (网络流解法)
- 网络流3最小路径覆盖问题
- 【网络流】最小路径覆盖问题
- 网络流二十四题之二 —— 太空飞行计划问题(SHUT)
- beanshell 线上修复BUG
- hdu 5115 Dire Wolf【区间dp】
- 基于Flume的美团日志收集系统(一)架构和设计
- nginx反向代理服务器调优
- 求二叉树的叶节点
- 网络流二十四题之三 —— 最小路径覆盖问题(PATH)
- 基于Flume的美团日志收集系统(二)改进和优化
- 序列化二叉树
- 第四次_Activity传递参数
- Eclispse Ctl+shift+f 将默认行数80变为120
- 对于函数的编程规范的看法(后期会有补充)
- CreateProcess的用法
- leetcode——40——Combination Sum II
- ShellSort