【题意】

  给定有向图 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 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...相关推荐

  1. hiho 第118周 网络流四·最小路径覆盖

    描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游 ...

  2. 「网络流24题」 题目列表

    「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分 ...

  3. cwl的网络流24题练习

    网络流24题 编号 题目 备注 1 飞行员配对方案问题 二分图最大匹配,可最大流解决 2 太空飞行计划问题   3 最小路径覆盖问题  有向图最小路径覆盖,解法都写题目上了 4 魔术球问题  有向图最 ...

  4. 囧——线性规划与网络流24题之网络流入门经典

    搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...

  5. hdu 4160 (Dolls)二分图的最小路径覆盖

    关于二分图,让人很头疼啊!归结为一句话,就是看不出来题目是二分图的问题. 也许是对二分图不太熟悉吧!需要多练习! 题目大意:给出n个箱子,每个箱子的参数为长,宽,高:(a,b,c):当且仅当箱子s1, ...

  6. 最小路径覆盖(最小路径覆盖)

    最小路径覆盖 Description 定义: 一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径.路径可以从任意结点开始和结束,且长度也为 ...

  7. 最大流 ---- 最小路径覆盖 ---- P2765魔术球问题(网络流24题)

    题目链接 解题思路: 这题题目看起来根本不像网络流但是确实用网络流做的 这个题目有两个限制 每个柱子上面的球相邻两个的和必须是平方数 球的编号必须是连续的 首先我们只考虑第一个条件的话,我们怎么转化成 ...

  8. 【网络流24题】D、魔术球问题(有向无环图的最小路径覆盖、思维)

    D.魔术球问题(有向无环图的最小路径覆盖.思维)[省选/NOI- ] P2765 魔术球问题 [问题分析] 枚举答案转化为判定性问题,然后最小路径覆盖,可以转化成二分图最大匹配,从而用最大流解决. [ ...

  9. 【网络流24题】最小路径覆盖问题

    [题目]1738: 最小路径覆盖问题 [题解]网络流 关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意. mark记录有入度的右侧点,然后从没 ...

最新文章

  1. 在 CUDA C/C++ kernel中使用内存
  2. 数据结构和算法:递归和迭代算法示例
  3. python walk 遍历文件夹 文件大小
  4. 北航计算机梅澜,水江澜-北京航空航天大学材料科学与工程学院
  5. 实践SQLServer Tuning
  6. Mozilla宣布关闭 Persona
  7. 第 1-5 课:深入了解 Java 中的异常处理 + 面试题
  8. HDU2520 我是菜鸟,我怕谁【水题】
  9. python 类型转换操作
  10. Ugly Numbers UVA - 136
  11. [引]SQL帮助文档:使用 WAITFOR 使SQL语句停顿后执行
  12. 基于微信小程序外卖点餐系统 开题报告
  13. (收藏)《博客园精华集》ASP.NET分册
  14. 关于CSS居中显示的总结
  15. Git: The following paths are ignored by one of your .gitignore files: xxx.dll
  16. Linux系统监视与进程管理
  17. C++ vector详细用法
  18. 聊聊外包团队的高效管理机制
  19. 百度地图的鼠标绘制工具
  20. @kubernetes(k8s)pod服务探针(健康检查)及回调钩子HOOK详解

热门文章

  1. Lisp的本质(The Nature of Lisp)
  2. ffmpeg视频处理
  3. american fuzzy lop 介绍
  4. 2021-04-13 Linux I/O模型
  5. (32)SystemVerilog语言编写打两拍
  6. java 空的构造函数_用javassist创建空的构造函数(java)不能上班
  7. java web mysql 登陆_javaweb登录功能实现,eclipse开发工具,mysql作为数据库
  8. mysql报错注入实战_手工注入——MySQL手工注入实战和分析
  9. 第4章——存储器、存储管理和高速缓存技术
  10. 【STM32】HAL库 STM32CubeMX教程十五---FMC-SDRAM(二)