【题目】1738: 最小路径覆盖问题

【题解】网络流

关于输出路径,因为即使有反向弧经过左侧点也一定会改变左侧点的去向,若没连向右侧就会被更新到0,所以不用在意。

mark记录有入度的右侧点,然后从没入度的右侧点开始把整条路径输出来即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=100000,inf=0x3f3f3f3f;
int n,m,S,T,d[maxn],q[10010],first[maxn],tot=1,nex[maxn];
bool mark[maxn];
struct edge{int from,v,flow;}e[maxn];
void insert(int u,int v,int w)
{tot++;e[tot].v=v;e[tot].flow=w;e[tot].from=first[u];first[u]=tot;tot++;e[tot].v=u;e[tot].flow=0;e[tot].from=first[v];first[v]=tot;}
bool bfs()
{memset(d,-1,4*(2*n+3));int head=0,tail=1;q[0]=S;d[S]=0;while(head<tail){int x=q[head++];if(head>10000)head=0;for(int i=first[x];i;i=e[i].from)if(e[i].flow&&d[e[i].v]==-1){int y=e[i].v;d[y]=d[x]+1;q[tail++]=y;if(tail>10000)tail=0;}}return d[T]!=-1;
}
int dinic(int x,int a)
{
//    printf("x=%d a=%d\n",x,a);if(x==T||a==0)return a;int flow=0,f;for(int i=first[x];i;i=e[i].from)if(e[i].flow&&d[e[i].v]==d[x]+1&&(f=dinic(e[i].v,min(a,e[i].flow)))>0){if(f>0){nex[x]=e[i].v;if(e[i].v-n>0)mark[e[i].v-n]=1;}e[i].flow-=f;e[i^1].flow+=f;a-=f;flow+=f;if(a==0)break;}return flow;
}
int main()
{scanf("%d%d",&n,&m);S=0,T=2*n+1;for(int i=1;i<=m;i++){int u,v;scanf("%d%d",&u,&v);insert(u,v+n,1);}for(int i=1;i<=n;i++)insert(S,i,1);for(int i=n+1;i<=2*n;i++)insert(i,T,1);int ans=n;while(bfs())ans-=dinic(S,inf);for(int i=1;i<=n;i++)if(!mark[i]){printf("%d ",i);int k=i;while(nex[k]){printf("%d ",nex[k]-n);k=nex[k]-n;}printf("\n");}printf("%d",ans);return 0;
}

View Code

转载于:https://www.cnblogs.com/onioncyc/p/6713130.html

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

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

    Description 问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任 ...

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

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

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

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

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

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

  5. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...

  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. 计算机基本知识培训稿,计算机基础知识培训稿.doc
  2. Nature综述: 地球上细菌和古菌的生物被膜丰度
  3. iBATIS.NET DataMapper V1.3 Beta and DataAccess V1.7 Beta发布了
  4. Android开发--图形图像与动画(二)--Animation实现图像的 渐变 缩放 位移 旋转
  5. 实用代码-C#之IP地址和整数的互转
  6. IP地址便捷修改器 V3.5 绿色版
  7. jetty java_Jetty,Java和OAuth入门
  8. java方法的重载与覆盖的返回值类型
  9. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)
  10. 洛谷P1080 国王游戏
  11. Spring 单元测试(Junit)
  12. win10添加开机启动项_Windows系统注册表添加开机启动项
  13. 完全激活win server 2012 R2 的方法(亲测可行!)
  14. PHP HTML转PDF
  15. Pandas 之DataFrame二维表基础操作及演示
  16. Python爬虫——利用新浪微盘下载周杰伦的歌曲(共190首)
  17. 程序员是不是青春饭?年纪大了何去何从
  18. 计算机一级标题底纹,2017年计算机一级考试MSOffice考点解析:幻灯片背景的设置...
  19. Minecraft Mod开发环境搭建 | Minecraft 1.15.2 | Forge 31.1.0
  20. 在Linux(Ubuntu)下安装Arial、Times New Roman等字体

热门文章

  1. QQ群功能设计与心理学
  2. RMAN_学习笔记1_RMAN Structure概述和体系结构
  3. python 多线程日志切割+日志分析
  4. 微软虚拟化解决方案课件
  5. 如何获得Oracle系统性能统计? Oracle大型数据库系统在AIXUNIX上的实战详解 集中讨论 14...
  6. django搭建示例-ubantu环境
  7. Ubuntu16.04.1 安装Nginx
  8. YEX黄建:脱离比特币谈区块链,要么真傻,要么装疯卖傻丨区块链十人谈
  9. mysql慢查询开启及分析方法
  10. Ubuntu环境变量