题目链接:点击查看

题目大意:给出一个由n个点和m条边组成的有向无环图,现在需要我们求最少可以将n个点分为多少条简单路径,并打印出每一条路径

题目分析:题意挺难懂的。。简单来说就是让求二分图最小路径覆盖,公式就是点数减去二分图最大匹配,所以肯定是要拆点了,拆点建图后直接跑最大流就是答案了,还是比较麻烦的就是路径打印了,这里打印的是每一条简单路径,我是跑了一遍残余网络,用数组模拟链表储存每一条道路,同时用vis数组沿路标记,第一个节点不予标记,最后直接从首节点沿路输出就好了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=310;struct Edge
{int to,w,next;
}edge[N*N];//边数int head[N],cnt,nx[N];bool vis[N];void addedge(int u,int v,int w)
{edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;edge[cnt].to=u;edge[cnt].w=0;//反向边边权设置为0edge[cnt].next=head[v];head[v]=cnt++;
}int d[N],now[N];//深度 当前弧优化bool bfs(int s,int t)//寻找增广路
{memset(d,0,sizeof(d));queue<int>q;q.push(s);now[s]=head[s];d[s]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(d[v])continue;if(!w)continue;d[v]=d[u]+1;now[v]=head[v];q.push(v);if(v==t)return true;}}return false;
}int dinic(int x,int t,int flow)//更新答案
{if(x==t)return flow;int rest=flow,i;for(i=now[x];i!=-1&&rest;i=edge[i].next){int v=edge[i].to;int w=edge[i].w;if(w&&d[v]==d[x]+1){int k=dinic(v,t,min(rest,w));if(!k)d[v]=0;edge[i].w-=k;edge[i^1].w+=k;rest-=k;}}now[x]=i;return flow-rest;
}void init()
{memset(vis,false,sizeof(vis));memset(nx,-1,sizeof(nx));memset(head,-1,sizeof(head));cnt=0;
}int solve(int st,int ed)
{int ans=0,flow;while(bfs(st,ed))while(flow=dinic(st,ed,inf))ans+=flow;return ans;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);init();int n,m,st=N-1,ed=st-1;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){addedge(st,i,1);addedge(i+n,ed,1);}while(m--){int u,v;scanf("%d%d",&u,&v);addedge(u,v+n,1);}int ans=n-solve(st,ed);for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){int u=i;int v=edge[j].to;int w=edge[j].w;if(v==st)continue;v-=n;if(w==0){nx[u]=v;vis[v]=true;}}}for(int i=1;i<=n;i++){if(!vis[i]){int k=i;while(k!=-1){printf("%d ",k);k=nx[k];}printf("\n");}}printf("%d\n",ans);return 0;
}

洛谷 - P2764 最小路径覆盖问题(最大流+二分图最小路径覆盖+路径打印)相关推荐

  1. 【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)

    传送门 洛谷 Solution 直接跑最小割板子就好了. 代码实现 #include<stdio.h> #include<stdlib.h> #include<strin ...

  2. 洛谷 P4012 深海机器人问题【费用流】

    题目链接:https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1: 1 1 2 2 1 2 3 4 5 6 ...

  3. AC日记——最小路径覆盖问题 洛谷 P2764

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

  4. 洛谷 P2764(最小路径覆盖=节点数-最大匹配)

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

  5. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication(最小割点,最大流) 题解

    题目来源: 点击打开链接 题目描述: 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1, ...

  6. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication(最小割)

    题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流.这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相 ...

  7. 洛谷 P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  8. 洛谷P3376 【模板】网络最大流

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  9. 洛谷P2770 航空路线问题(费用流)

    传送门 完了这题好厉害--字符串什么的好麻烦-- 要求从$1$到$n$的路径,不重复,经过边数最多 每一个点拆成两个,$A_i,B_i$,然后$A_i$到$B_i$连容量为$1$,费用为$1$的边,保 ...

最新文章

  1. 24-Thief小偷-Crime犯罪
  2. 阿联酋是发达国家还是发展中国家
  3. eclipse tomcat插件安装
  4. c语言发展过程,C语言发展史
  5. 在Biztalk应用中调用程序集的方法
  6. 深入理解JVM-类加载器深入解析(3)
  7. SQL server 數據庫 從SQL2000搬移到SQL2016
  8. coreseek mysql_coreseek,php,mysql全文检索部署(一)
  9. 编程语言难度排名_文言文可编程乎?CMU中国大四学生:开源文言文编程语言获1万+标星...
  10. matlab 求信噪比
  11. C#上位机与台达PLC通信,modbus TCP协议。真实使用项目,该程序框架完整,适合在此基础上开发项目
  12. 悉尼大学计算机专业新生,悉尼大学计算机专业详解
  13. linux 拒绝访问文件夹,文件夹拒绝访问的原因与解决办法
  14. 停止员工拖延症!工时管理系统的作用之一
  15. 【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
  16. 面矢量栅格化(python)
  17. 小米手机5s Plus超简单刷成开发版启用Root超级权限的经验
  18. 相位延时、相位延迟、群延时
  19. 什么是Session 如何使用Session
  20. 深度学习benchmark汇总

热门文章

  1. 执行SQL-获取缓存
  2. Redis中的zset 有序集合
  3. Power Designer介绍
  4. 数据库-数据库的备份与恢复
  5. 全局变量-函数内部不允许修改局部变量的值
  6. SpringBoot高级-检索-SpringBoot整合Jest操作ES
  7. SpringBoot_入门-微服务简介
  8. 组合模式coding
  9. oracle 分析函数、GROUPING函数
  10. mac osx linux,Linux 、Mac OSX 常见问题 及 笔记