cogs 728. [网络流24题] 最小路径覆盖问题
来源:互联网 发布:淘宝a店是什么店 编辑:程序博客网 时间:2024/05/06 04:26
- [网络流24题] 最小路径覆盖问题
★★☆ 输入文件:path3.in 输出文件:path3.out 评测插件
时间限制:1 s 内存限制:128 MB
算法实现题8-3 最小路径覆盖问题(习题8-13)
´问题描述:
给定有向图G=(V,E)。设P是G的一个简单路(顶点不相交)的集合。如果V中每个
顶点恰好在P的一条路上,则称P是G的一个路径覆盖。P中路径可以从V的任何一个顶
点开始,长度也是任意的,特别地,可以为0。G的最小路径覆盖是G的所含路径条数最少
的路径覆盖。
设计一个有效算法求一个有向无环图G的最小路径覆盖。
提示:
设V={1,2,… ,n},构造网络G1=(V1,E1)如下:
每条边的容量均为1。求网络G1的(x0,y0)最大流。
´编程任务:
对于给定的给定有向无环图G,编程找出G的一个最小路径覆盖。
´数据输入:
由文件input.txt提供输入数据。文件第1行有2个正整数n和m。n是给定有向无环图
G的顶点数,m是G的边数。接下来的m行,每行有2个正整数i 和j,表示一条有向边(i,j)。
´结果输出:
程序运行结束时,将最小路径覆盖输出到文件output.txt中。从第1行开始,每行输出
一条路径。文件的最后一行是最少路径数。
输入文件示例
input.txt
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
输出文件示例
output.txt
1 4 7 10 11
2 5 8
3 6 9
3
数据范围:
1<=n<=150,1<=m<=6000
【分析】
题里说了做法…路径覆盖转为二分图最大匹配问题
加边操作竟然写错了…也是没谁了
【代码】
//cogs 728. [网络流24题] 最小路径覆盖问题#include<iostream>#include<climits>#include<cstdio>#include<queue>#include<cstring>#define inf 1e9+7#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=10005;queue <int> q;int n,m,s,t,ans,cnt;int head[mxn],dis[mxn],pre[mxn],next[mxn];struct node {int to,num,next,flow;} f[mxn<<2]; inline void add(int u,int v,int flow,int num) //num:边的编号 { f[++cnt].to=v,f[cnt].next=head[u],f[cnt].flow=flow,f[cnt].num=num,head[u]=cnt; f[++cnt].to=u,f[cnt].next=head[v],f[cnt].flow=0,f[cnt].num=num,head[v]=cnt;}inline bool bfs(){ int i,j,u,v,flow; q.push(s); memset(dis,-1,sizeof dis); dis[s]=0; while(!q.empty()) { u=q.front(); q.pop(); for(i=head[u];i;i=f[i].next) { v=f[i].to,flow=f[i].flow; if(dis[v]==-1 && flow>0) dis[v]=dis[u]+1,q.push(v); } } if(dis[t]>0) return 1; return 0;}inline int find(int u,int low){ int i,j,v,a,flow,sum=0; if(u==t) return low; for(i=head[u];i;i=f[i].next) { v=f[i].to,flow=f[i].flow; if(dis[v]==dis[u]+1 && flow>0 && (a=find(v,min(low-sum,flow)))) { sum+=a; f[i].flow-=a; if(i&1) f[i+1].flow+=a; else f[i-1].flow+=a; } } if(!sum) dis[u]=-1; return sum;}int main(){// freopen("path3.in","r",stdin); // freopen("path3.out","w",stdout); int i,j,u,v,x,y,flow; scanf("%d%d",&n,&m); s=0,t=n+n+1; fo(i,1,m) { scanf("%d%d",&u,&v); add(u,v+n,1,i); } fo(u,1,n) add(s,u,1,0),add(u+n,t,1,0); while(bfs()) ans+=find(s,INT_MAX); fo(u,1,n) { for(i=head[u];i;i=f[i].next) { v=f[i].to,flow=f[i].flow; if(v!=s && !flow) pre[v]=u,next[u]=v; } } fo(x,1,n) if(!pre[x+n]) //如果没有入边 { u=x; while(next[u]) { printf("%d ",u); v=next[u]; u=v-n; } printf("%d\n",u); } printf("%d\n",n-ans); return 0;}//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
0 0
- Cogs 728. [网络流24题] 最小路径覆盖问题
- cogs 728. [网络流24题] 最小路径覆盖问题
- COGS 728. [网络流24题] 最小路径覆盖问题
- 网络流24题3最小路径覆盖问题(洛谷 P2764 最小路径覆盖问题)
- 线性规划与网络流24题の3 最小路径覆盖问题(最小路径覆盖)
- [网络流24题 #3]最小路径覆盖问题
- [网络流24题] 最小路径覆盖问题
- kyeremal-网络流24题T3-最小路径覆盖问题
- 【二分匹配】 [网络流24题] 最小路径覆盖问题
- code vs [网络流24题]最小路径覆盖问题
- 【网络流24题】最小路径覆盖问题
- [网络流24题]最小路径覆盖问题
- 最小路径覆盖问题[网络流24题之3]
- 网络流24题——最小路径覆盖问题
- nefu481最小路径覆盖问题【网络流24题】
- 网络流24题3 最小路径覆盖问题
- 网络流24题3 最小路径覆盖问题
- 【网络流24题】最小路径覆盖问题
- python split() join()
- JavaScript实现类的private、public
- Spring MVC高级配置
- eclipse中Tomcat启动之后访问不了
- 堆排序
- cogs 728. [网络流24题] 最小路径覆盖问题
- sys.argv用法
- IntelliJ Idea 常用快捷键列表
- Cloudera Manager、CDH零基础入门、线路指导
- 代码注释:机器学习实战第7章 利用AdaBoost元算法提高分类性能
- 操作系统小练习3
- LeetCode
- ubuntu 16.04上对Python版本之间的切换(2.7\3.X)
- 双系统 ubuntu 16.04 和 win 10 时间同步问题