传送门

可惜洛谷上没有special judge,不然用匈牙利也可以过的,因为匈牙利在增广上有一个顺序问题,所以没有special judge就过不了了。

好在这个题的测试数据比较特殊,如果是网络流的话按照顺序加边,就可以过。

最小不相交路径覆盖 = 总点数 - 最大匹配数

——代码

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #define N 20001
  6. #define min(x, y) ((x) < (y) ? (x) : (y))
  7. #define max(x, y) ((x) > (y) ? (x) : (y))
  8.  
  9. int n, m, cnt, sum, s, t;
  10. int head[N], belong[N], to[N], next[N], val[N], suc[N], cur[N], dis[N];
  11.  
  12. inline int read()
  13. {
  14. int x = , f = ;
  15. char ch = getchar();
  16. for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
  17. for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
  18. return x * f;
  19. }
  20.  
  21. inline void add(int x, int y, int z)
  22. {
  23. to[cnt] = y;
  24. val[cnt] = z;
  25. next[cnt] = head[x];
  26. head[x] = cnt++;
  27. }
  28.  
  29. inline bool bfs()
  30. {
  31. int i, u, v;
  32. std::queue <int> q;
  33. memset(dis, -, sizeof(dis));
  34. q.push(s);
  35. dis[s] = ;
  36. while(!q.empty())
  37. {
  38. u = q.front(), q.pop();
  39. for(i = head[u]; i ^ -; i = next[i])
  40. {
  41. v = to[i];
  42. if(val[i] && dis[v] == -)
  43. {
  44. dis[v] = dis[u] + ;
  45. if(v == t) return ;
  46. q.push(v);
  47. }
  48. }
  49. }
  50. return ;
  51. }
  52.  
  53. inline int dfs(int u, int maxflow)
  54. {
  55. if(u == t) return maxflow;
  56. int i, v, d, ret = ;
  57. for(i = cur[u]; i ^ -; i = next[i])
  58. {
  59. v = to[i];
  60. if(val[i] && dis[v] == dis[u] + )
  61. {
  62. d = dfs(v, min(val[i], maxflow - ret));
  63. ret += d;
  64. cur[u] = i;
  65. val[i] -= d;
  66. val[i ^ ] += d;
  67. if(d) suc[u] = v - n;
  68. if(ret == maxflow) return ret;
  69. }
  70. }
  71. return ret;
  72. }
  73.  
  74. int main()
  75. {
  76. int i, j, x, y, now;
  77. n = read();
  78. m = read();
  79. s = , t = (n << ) + ;
  80. memset(head, -, sizeof(head));
  81. for(i = ; i <= m; i++)
  82. {
  83. x = read();
  84. y = read();
  85. add(x, y + n, );
  86. add(y + n, x, );
  87. }
  88. for(i = ; i <= n; i++)
  89. {
  90. add(s, i, );
  91. add(i, s, );
  92. add(i + n, t, );
  93. add(t, i + n, );
  94. }
  95. while(bfs())
  96. {
  97. for(i = s; i <= t; i++) cur[i] = head[i];
  98. sum += dfs(s, 1e9);
  99. }
  100. for(i = ; i <= n; i++)
  101. if(suc[i])
  102. {
  103. now = i;
  104. while(now)
  105. {
  106. printf("%d ", now);
  107. x = suc[now];
  108. suc[now] = ;
  109. now = x;
  110. }
  111. puts("");
  112. }
  113. printf("%d\n", n - sum);
  114. return ;
  115. }

[luoguP2764] 最小路径覆盖问题(最大流 || 二分图最大匹配)的更多相关文章

  1. LuoguP2764 最小路径覆盖问题(最大流)

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

  2. uva1201 DAG 最小路径覆盖,转化为 二分图

    大白例题P356 你在一座城市里负责一个大型活动的接待工作.你需要去送m个人从出发地到目的地,已知每个人的出发时间出发地点,和目的地点,你的任务是用尽量少的出租车送他们,使得每次出租车接客人,至少能提 ...

  3. 【Luogu】P2764最小路径覆盖(拆点求最大匹配)

    题目链接 这个……学了一条定理 最小路径覆盖=原图总点数-对应二分图最大匹配数 这个对应二分图……是什么呢? 就是这样 这是原图 这是拆点之后对应的二分图. 然后咱们的目标就是从这张图上跑出个最大流来 ...

  4. [题解] LuoguP2764 最小路径覆盖问题

    传送门 好久没做网络流方面的题发现自己啥都不会了qwq 题意:给一张有向图,让你用最少的简单路径覆盖所有的点. 考虑这样一个东西,刚开始,我们有\(n\)条路径,每条路径就是单一的一个点,那么我们的目 ...

  5. P2764 [网络流24题]最小路径覆盖问题[最大流]

    地址 这题有个转化,求最少的链覆盖→即求最少联通块. 设联通块个数$x$个,选的边数$y$,点数$n$个 那么有 $y=n-x$   即  $x=n-y$ 而n是不变的,目标就是在保证每个点入度.出度 ...

  6. P2764 最小路径覆盖问题 题解(二分图)

    建图思路很明确,拆点跑最大匹配,但这明显是个二分图的题题解居然只有一篇匈牙利算法. 发一种和之前那篇匈牙利思路略有不同的题解. 本题的难点就是如何输出,那么我们不妨在建图的时候加入一个原则,即:连边时 ...

  7. 洛谷P2764 最小路径覆盖问题(最大流)

    传送门 先说做法:把原图拆成一个二分图,每一个点被拆成$A_i,B_i$,若原图中存在边$(u,v)$,则连边$(A_u,B_v)$,然后$S$对所有$A$连边,所有$B$对$T$连边,然后跑一个最大 ...

  8. bzoj 2044 三维导弹拦截——DAG最小路径覆盖(二分图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2044 还以为是CDQ.发现自己不会三维以上的…… 第一问可以n^2.然后是求最长不下降子序列 ...

  9. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖

    先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...

随机推荐

  1. Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...

  2. 多并发下 SimpleDateFormat 出现错误

    private static String time = "2019-01-11 11:11:11"; private static long timestamp = 154717 ...

  3. EditPlus 3.7激活码注册码

    EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...

  4. 怎么在WEBSTORM中设置代码模板 Live Templates

    怎么在WEBSTORM中设置代码模板 Live Templates setting 里面 https://www.cnblogs.com/xinzaimengzai/p/9938464.html

  5. mac层到ath9k层,ath9k层到硬件层

    如上图,整个 mac 层分成两个部分——UMAC 和 LMAC.LMAC 分成 MAC 下半部分和硬件抽象层. 硬件抽象层和ath9k层的连接 在hw.h中的函数struct ath_hw_ops() ...

  6. OC和C++的混用1

    //Objective-C类 /*在混用之前需要做一步非常重要的事:不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++. 修 ...

  7. 【离线 撤销并查集 线段树分治】bzoj1018: [SHOI2008]堵塞的交通traffic

    本题可化成更一般的问题:离线动态图询问连通性 当然可以利用它的特殊性质,采用在线线段树维护一些标记的方法 Description 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常 ...

  8. Linux - which xxx - 查找执行的命令所在的路径

    Linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? Linux 下有2个命令可完成该功能:which ,whereis which 用来查看当 ...

  9. k8s资源指标API及metrics-server资源监控

    简述: 在k8s早期版本中,对资源的监控使用的是heapster的资源监控工具. 但是从 Kubernetes 1.8 开始,Kubernetes 通过 Metrics API 获取资源使用指标,例如 ...

  10. 03Qt信号与槽(2)

    1. 元对象工具 ​ 元对象编译器 MOC(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字及指向这些函 ...