【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...
【题意】
给定有向图 G=(V,E)。设 P 是 G 的一个简单路(顶点不相交) 的集合。如果 V 中每个
顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖。 P 中路径可以从 V 的任何一个顶
点开始, 长度也是任意的, 特别地, 可以为 0。 G 的最小路径覆盖是 G 的所含路径条数最少
的路径覆盖。
设计一个有效算法求一个有向无环图 G 的最小路径覆盖。
输入文件示例
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
【分析】
假设一开始每个点是一条路径,如果有一条有向边u->v 那么可以减少一条路径,但选这些有向边集合每个点的入度 出度 都为1.
那就是一个最大二分匹配。
这次我打的是网络流哦~
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define Maxn 1100 9 #define INF 0xfffffff 10 11 struct node 12 { 13 int x,y,f,o,next; 14 }t[Maxn*Maxn];int len; 15 int first[Maxn]; 16 17 int mymin(int x,int y) {return x<y?x:y;} 18 19 void ins(int x,int y,int f) 20 { 21 t[++len].x=x;t[len].y=y;t[len].f=f; 22 t[len].next=first[x];first[x]=len;t[len].o=len+1; 23 t[++len].x=y;t[len].y=x;t[len].f=0; 24 t[len].next=first[y];first[y]=len;t[len].o=len-1; 25 } 26 27 int st,ed; 28 queue<int > q; 29 int dis[Maxn]; 30 bool bfs() 31 { 32 while(!q.empty()) q.pop(); 33 memset(dis,-1,sizeof(dis)); 34 q.push(st);dis[st]=0; 35 while(!q.empty()) 36 { 37 int x=q.front(); 38 for(int i=first[x];i;i=t[i].next) if(t[i].f>0) 39 { 40 int y=t[i].y; 41 if(dis[y]==-1) 42 { 43 dis[y]=dis[x]+1; 44 q.push(y); 45 } 46 } 47 q.pop(); 48 } 49 if(dis[ed]==-1) return 0; 50 return 1; 51 } 52 53 int ffind(int x,int flow) 54 { 55 if(x==ed) return flow; 56 int now=0; 57 for(int i=first[x];i;i=t[i].next) if(t[i].f>0) 58 { 59 int y=t[i].y; 60 if(dis[y]==dis[x]+1) 61 { 62 int a=ffind(y,mymin(flow-now,t[i].f)); 63 t[i].f-=a; 64 t[t[i].o].f+=a; 65 now+=a; 66 } 67 if(now==flow) break; 68 } 69 if(now==0) dis[x]=-1; 70 return now; 71 } 72 73 void output() 74 { 75 for(int i=1;i<=len;i+=2) 76 printf("%d->%d %d\n",t[i].x,t[i].y,t[i].f); 77 } 78 79 int max_flow() 80 { 81 int ans=0; 82 while(bfs()) 83 { 84 ans+=ffind(st,INF); 85 // printf("--%d\n",ans); 86 // output(); 87 } 88 return ans; 89 } 90 91 int nt[Maxn]; 92 bool qq[Maxn]; 93 94 int main() 95 { 96 int n,m; 97 scanf("%d%d",&n,&m); 98 len=0; 99 memset(first,0,sizeof(first)); 100 for(int i=1;i<=m;i++) 101 { 102 int x,y; 103 scanf("%d%d",&x,&y); 104 ins(x,y+n,1); 105 } 106 st=2*n+1;ed=st+1; 107 for(int i=1;i<=n;i++) ins(st,i,1); 108 for(int i=1;i<=n;i++) ins(i+n,ed,1); 109 memset(nt,0,sizeof(nt)); 110 memset(qq,1,sizeof(qq)); 111 int x=max_flow(); 112 // output(); 113 for(int i=1;i<=len;i+=2) if(t[i].x!=st&&t[i].y!=ed&&t[i].f==0) 114 nt[t[i].x]=t[i].y-n,qq[t[i].y-n]=0; 115 for(int i=1;i<=n;i++) if(qq[i]) 116 { 117 int x=i; 118 while(x) 119 { 120 printf("%d ",x); 121 x=nt[x]; 122 }printf("\n"); 123 } 124 printf("%d\n",n-x); 125 return 0; 126 }
View Code
2016-11-04 10:13:40
转载于:https://www.cnblogs.com/Konjakmoyu/p/6029229.html
【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...相关推荐
- hiho 第118周 网络流四·最小路径覆盖
描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游 ...
- 「网络流24题」 题目列表
「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...
- cwl的网络流24题练习
网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题 3 最小路径覆盖问题 有向图最小路径覆盖,解法都写题目上了 4 魔术球问题 有向图最 ...
- 囧——线性规划与网络流24题之网络流入门经典
搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...
- hdu 4160 (Dolls)二分图的最小路径覆盖
关于二分图,让人很头疼啊!归结为一句话,就是看不出来题目是二分图的问题. 也许是对二分图不太熟悉吧!需要多练习! 题目大意:给出n个箱子,每个箱子的参数为长,宽,高:(a,b,c):当且仅当箱子s1, ...
- 最小路径覆盖(最小路径覆盖)
最小路径覆盖 Description 定义: 一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径.路径可以从任意结点开始和结束,且长度也为 ...
- 最大流 ---- 最小路径覆盖 ---- P2765魔术球问题(网络流24题)
题目链接 解题思路: 这题题目看起来根本不像网络流但是确实用网络流做的 这个题目有两个限制 每个柱子上面的球相邻两个的和必须是平方数 球的编号必须是连续的 首先我们只考虑第一个条件的话,我们怎么转化成 ...
- 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)
D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...
- 【网络流24题】最小路径覆盖问题
[题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...
最新文章
- 在 CUDA C/C++ kernel中使用内存
- 数据结构和算法:递归和迭代算法示例
- python walk 遍历文件夹 文件大小
- 北航计算机梅澜,水江澜-北京航空航天大学材料科学与工程学院
- 实践SQLServer Tuning
- Mozilla宣布关闭 Persona
- 第 1-5 课:深入了解 Java 中的异常处理 + 面试题
- HDU2520 我是菜鸟,我怕谁【水题】
- python 类型转换操作
- Ugly Numbers UVA - 136
- [引]SQL帮助文档:使用 WAITFOR 使SQL语句停顿后执行
- 基于微信小程序外卖点餐系统 开题报告
- (收藏)《博客园精华集》ASP.NET分册
- 关于CSS居中显示的总结
- Git: The following paths are ignored by one of your .gitignore files: xxx.dll
- Linux系统监视与进程管理
- C++ vector详细用法
- 聊聊外包团队的高效管理机制
- 百度地图的鼠标绘制工具
- @kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解
热门文章
- Lisp的本质(The Nature of Lisp)
- ffmpeg视频处理
- american fuzzy lop 介绍
- 2021-04-13 Linux I/O模型
- (32)SystemVerilog语言编写打两拍
- java 空的构造函数_用javassist创建空的构造函数(java)不能上班
- java web mysql 登陆_javaweb登录功能实现,eclipse开发工具,mysql作为数据库
- mysql报错注入实战_手工注入——MySQL手工注入实战和分析
- 第4章——存储器、存储管理和高速缓存技术
- 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)