题源:https://nanti.jisuanke.com/t/11215

分析:这题是一个比较经典的网络流模型。把中间节点当做源,两端节点当做汇,对节点进行拆点,做一个流量为 22 的流即可。

吐槽:这是官方题解,然后其实赛场上谢了这个解法,但是我写搓了,因为最后输出路径的时候傻逼了

我居然向最短路一样记录前驱输出路径,简直傻逼了

着重强调(对我自己):网络流的一次增广是需要记录前驱的,但是多次增广以后,可以反向流,前驱就不对了

所以要判断哪些边,在最大流上时,需要枚举边,看哪个满流,然后随便搞搞

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <string>
  7. #include <stack>
  8. #include <vector>
  9. #include <map>
  10. #include <queue>
  11. #include <algorithm>
  12. #include <utility>
  13. using namespace std;
  14. typedef long long LL;
  15. const int N=;
  16. const int INF=0x3f3f3f3f;
  17. int cap[N][N],flow[N][N],n,m,s,t;
  18. bool vis[N];
  19. int p[N],a[N];
  20. void maxflow(int s,int t){
  21. queue<int>q;
  22. memset(flow,,sizeof(flow));
  23. while(){
  24. memset(a,,sizeof(a));
  25. memset(vis,false,sizeof(vis));
  26. while(!q.empty())q.pop();
  27. a[s]=INF;q.push(s);
  28. while(!q.empty()){
  29. int u=q.front();q.pop();
  30. if(u==t)break;
  31. for(int v=;v<=n*+;++v)
  32. if(!a[v]&&flow[u][v]<cap[u][v]){
  33. vis[v]=true;
  34. p[v]=u;a[v]=min(a[u],cap[u][v]-flow[u][v]);
  35. q.push(v);
  36. }
  37. }
  38. if(!a[t])break;
  39. for(int u=t;u!=s;u=p[u]){
  40. flow[p[u]][u]+=a[t];
  41. flow[u][p[u]]-=a[t];
  42. }
  43. }
  44. }
  45. struct Edge{
  46. int v,next;
  47. }edge[*];
  48. int head[],tot;
  49. void add(int u,int v){
  50. edge[tot].v=v;
  51. edge[tot].next=head[u];
  52. head[u]=tot++;
  53. }
  54. vector<int>ret;
  55. void dfs(int u,int f){
  56. ret.push_back(u);
  57. for(int i=head[u];~i;i=edge[i].next){
  58. int v=edge[i].v;
  59. if(v==f)continue;
  60. dfs(v,u);
  61. }
  62. }
  63. int main()
  64. {
  65. int T;
  66. scanf("%d",&T);
  67. while(T--){
  68. int a,b,mid;
  69. scanf("%d%d%d%d%d",&n,&m,&a,&b,&mid);
  70. s=,t=n*+;
  71. memset(cap,,sizeof(cap));
  72. for(int i=;i<m;++i){
  73. int u,v;
  74. scanf("%d%d",&u,&v);
  75. cap[u+n][v]=cap[v+n][u]=;
  76. }
  77. for(int i=;i<=n;++i)
  78. cap[i][i+n]=;
  79. cap[s][mid]=cap[mid][mid+n]=;
  80. cap[a+n][t]=cap[b+n][t]=;
  81. maxflow(s,t);
  82. memset(head,-,sizeof(head));tot=;
  83. for(int i=+n;i<=n+n;++i){
  84. if(!flow[i-n][i])continue;
  85. for(int j=;j<=n;++j){
  86. if(cap[i][j]&&flow[i][j]==cap[i][j]){
  87. add(i-n,j);add(j,i-n);
  88. }
  89. }
  90. }
  91. ret.clear();
  92. dfs(a,);
  93. for(int i=;i<ret.size();++i){
  94. printf("%d",ret[i]);
  95. if(i+==ret.size())printf("\n");
  96. else printf(" ");
  97. }
  98. }
  99. return ;
  100. }

2016计蒜之道复赛 菜鸟物流的运输网络 网络流EK的更多相关文章

  1. 2016计蒜之道复赛 百度地图的实时路况 floyd+cdq分治

    链接:https://nanti.jisuanke.com/t/11217 奉上官方题解: 枚举 d(x , y , z) 中的 y,把 y 从这个图中删去,再求这时的全源最短路即可,使用 Floyd ...

  2. 2016计蒜之道复赛B题:联想专卖店促销

    题解 思路: 二分答案,设我们要check的值为x. 注意到每一个礼包都有,一个U盘,一个鼠标. 剩余的,分别为一个机械键盘,一个U盘,一个鼠标. 当礼包数目为x时,我们至多可以提供a-x个普通,b- ...

  3. 2016计蒜之道复赛 百度地图的实时路况(Floyd 分治)

    题意 题目链接 Sol 首先一个结论:floyd算法的正确性与最外层\(k\)的顺序无关(只要保证是排列即可) 我大概想到一种证明方式就是把最短路树上的链拿出来,不论怎样枚举都会合并其中的两段,所以正 ...

  4. 2016计蒜之道复赛 百度地图的实时路况 分治+Floyd

    题目链接:https://nanti.jisuanke.com/t/A1108 这道题还挺有意思的.让我对Floyd的了解又加深了一点. 首先我们重新审视Floyd这三重循环到底有什么用?第一层是枚举 ...

  5. 2016计蒜之道复赛A 百度地图的实时路况

    百度地图的实时路况功能相当强大,能方便出行的人们避开拥堵路段.一个地区的交通便捷程度就决定了该地区的拥堵情况.假设一个地区有 nnn 个观测点,编号从 111 到 nnn.定义 d(u,v,w)d(u ...

  6. 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)

    贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于  ...

  7. 2016计蒜之道初赛第四场A

    在每年的淘宝“双十一”时,访问量都会暴涨,服务器的请求会被流量分配程序按照一定策略,分发给不同的进程去处理.有一类请求,有两个进程可以接受分发的请求,其中一个进程所在服务器的配置.网络传输性能等都要优 ...

  8. 2016 计蒜之道 初赛 第一场 D 青云的机房组网方案 (虚树)

    大意: 给定树, 点$i$的点权为$a_i$, 求$\sum\limits_{a_i \perp a_j}dis(i,j)$ 中等难度可以枚举每条边的贡献, 维护子树内每个数出现次数$a$, 转化为求 ...

  9. 2019 计蒜之道 复赛 E. 撑起信息安全“保护伞” (贪心,构造,规律)

    为了给全球小学员打起信息安全"保护伞",VIPKID 还建立了一套立体化的安全防御体系,7 \times 247×24 小时持续安全监控与应急响应等多项联动,具备业界最高级别的数据 ...

随机推荐

  1. Project Euler 100 : Arranged probability 安排概率

    Arranged probability If a box contains twenty-one coloured discs, composed of fifteen blue discs and ...

  2. 从一次面试经历谈PHP的普通传值与引用传值以及unset

    关于这个概念一般都会在PHP的第一堂课说变量的时候给介绍,并且我以前还给其他PHPer介绍这个概念.但是作为一个工作一段时间的PHPer的我,竟然在面试的时候一下子拿不定主意最后还答错了,很觉得丢脸( ...

  3. C#调用Win32 api学习总结

    从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...

  4. C++:派生类的构造函数和析构函数

    4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类 ...

  5. 显示Servlet API主要版本,次要版本以及服务器系统信息

    package com.mhb; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Servle ...

  6. Nginx+Tomcat+Memcached负载均衡集群服务搭建

    操作系统:CentOS6.5  本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat负责实际服务,Memc ...

  7. JDBC学习总结(三)

    1.ResultSet光标控制     在创建Statement或PreparedStatement时使用的是Connection的无参数createStatement()方法或preparedSta ...

  8. 04-语言入门-04-Fibonacci数

    地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=13    描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibona ...

  9. Android开发之异步通信Handler机制

    郭大神的:http://blog.csdn.net/guolin_blog/article/details/9991569 http://www.jianshu.com/p/08cb3665972f ...

  10. Java 比较两张图片的相似度

    import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; /** * 比较两张图片 ...