「CQOI2016」不同的最小割

传送门

建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了。

参考代码:

  1. #include <algorithm>
  2. #include <cstring>
  3. #include <cstdio>
  4. #define rg register
  5. #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
  6. using namespace std;
  7. template < class T > inline void read(T& s) {
  8. s = 0; int f = 0; char c = getchar();
  9. while ('0' > c || c > '9') f |= c == '-', c = getchar();
  10. while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
  11. s = f ? -s : s;
  12. }
  13. const int _ = 850 + 10, __ = 8500 * 2 + 10, INF = 2147483647;
  14. int tot = 1, head[_], Cap[__ << 1], Q[_];
  15. struct Edge { int ver, cap, nxt; } edge[__ << 1];
  16. inline void Add_edge(int u, int v, int d) { edge[++tot] = (Edge) { v, d, head[u] }, head[u] = tot ; }
  17. inline void link(int u, int v, int d) { Add_edge(u, v, d), Cap[tot] = d, Add_edge(v, u, 0), Cap[tot] = 0; }
  18. int n, m, dep[_], cur[_], p[_], t1[_], t2[_];
  19. int num; struct node { int x, y, z; } G[_];
  20. int fa[10][_], mn[10][_], len, ans[_ * _];
  21. inline int bfs(int s, int t) {
  22. int hd = 0, tl = 0;
  23. memset(dep + 1, 0, sizeof (int) * n);
  24. Q[++tl] = s, dep[s] = 1;
  25. while (hd < tl) {
  26. int u = Q[++hd];
  27. for (rg int i = head[u]; i; i = edge[i].nxt) {
  28. int v = edge[i].ver;
  29. if (dep[v] == 0 && edge[i].cap > 0)
  30. dep[v] = dep[u] + 1, Q[++tl] = v;
  31. }
  32. }
  33. return dep[t] > 0;
  34. }
  35. inline int dfs(int u, int flow, int t) {
  36. if (u == t) return flow;
  37. for (rg int& i = cur[u]; i; i = edge[i].nxt) {
  38. int v = edge[i].ver;
  39. if (dep[v] == dep[u] + 1 && edge[i].cap > 0) {
  40. int res = dfs(v, min(flow, edge[i].cap), t);
  41. if (res) { edge[i].cap -= res, edge[i ^ 1].cap += res; return res; }
  42. }
  43. }
  44. return 0;
  45. }
  46. inline int Dinic(int s, int t) {
  47. for (rg int i = 2; i <= tot; ++i) edge[i].cap = Cap[i];
  48. int res = 0;
  49. while (bfs(s, t)) {
  50. for (rg int i = 1; i <= n; ++i) cur[i] = head[i];
  51. while (int d = dfs(s, INF, t)) res += d;
  52. }
  53. return res;
  54. }
  55. inline void solve(int l, int r) {
  56. if (l == r) return ;
  57. int s = p[l], t = p[l + 1];
  58. G[++num] = (node) { s, t, Dinic(s, t) };
  59. int p1 = 0, p2 = 0;
  60. for (rg int i = l; i <= r; ++i) if (dep[p[i]]) t1[++p1] = p[i]; else t2[++p2] = p[i];
  61. for (rg int i = 1; i <= p1; ++i) p[l + i - 1] = t1[i];
  62. for (rg int i = 1; i <= p2; ++i) p[l + p1 + i - 1] = t2[i];
  63. solve(l, l + p1 - 1), solve(l + p1, r);
  64. }
  65. inline void dfs(int u, int f) {
  66. dep[u] = dep[f] + 1;
  67. for (rg int i = head[u]; i; i = edge[i].nxt) {
  68. int v = edge[i].ver; if (v == f) continue ;
  69. fa[0][v] = u, mn[0][v] = edge[i].cap, dfs(v, u);
  70. }
  71. }
  72. inline int calc(int x, int y) {
  73. int res = INF;
  74. if (dep[x] < dep[y]) swap(x, y);
  75. for (rg int i = 8; ~i; --i)
  76. if (dep[fa[i][x]] >= dep[y]) res = min(res, mn[i][x]), x = fa[i][x];
  77. if (x == y) return res;
  78. for (rg int i = 8; ~i; --i)
  79. if (fa[i][x] != fa[i][y]) res = min(res, min(mn[i][x], mn[i][y])), x = fa[i][x], y = fa[i][y];
  80. return min(res, min(mn[0][x], mn[0][y]));
  81. }
  82. int main() {
  83. #ifndef ONLINE_JUDGE
  84. file("cpp");
  85. #endif
  86. read(n), read(m);
  87. tot = 1, memset(head, 0, sizeof head);
  88. for (rg int u, v, d; m--; ) read(u), read(v), read(d), link(u, v, d), link(v, u, d);
  89. for (rg int i = 1; i <= n; ++i) p[i] = i;
  90. num = 0, solve(1, n);
  91. tot = 0, memset(head, tot, sizeof head);
  92. for (rg int i = 1; i <= num; ++i) Add_edge(G[i].x, G[i].y, G[i].z), Add_edge(G[i].y, G[i].x, G[i].z);
  93. fa[0][1] = 0, dfs(1, 0);
  94. for (rg int i = 1; i <= 8; ++i)
  95. for (rg int u = 1; u <= n; ++u)
  96. fa[i][u] = fa[i - 1][fa[i - 1][u]], mn[i][u] = min(mn[i - 1][u], mn[i - 1][fa[i - 1][u]]);
  97. for (rg int i = 1; i <= n; ++i) for (rg int j = i + 1; j <= n; ++j) ans[++len] = calc(i, j);
  98. sort(ans + 1, ans + len + 1);
  99. int QwQ = unique(ans + 1, ans + len + 1) - ans - 1;
  100. printf("%d\n", QwQ);
  101. return 0;
  102. }

「CQOI2016」不同的最小割的更多相关文章

  1. LoibreOJ 2042. 「CQOI2016」不同的最小割 最小割树 Gomory-Hu tree

    2042. 「CQOI2016」不同的最小割 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. LibreOJ2042 - 「CQOI2016」不同的最小割

    Portal Description 给出一个给出一个\(n(n\leq850)\)个点\(m(m\leq8500)\)条边的无向图.定义\(cut(s,t)\)等于\(s,t\)的最小割的容量,求在 ...

  3. loj2042 「CQOI2016」不同的最小割

    分治+最小割 看到题解的第一句话是这个就秒懂了,然后乱七八糟的错误.越界.RE-- #include <algorithm> #include <iostream> #incl ...

  4. 「BZOJ2127」happiness(最小割)

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  5. Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型

    问题描述 提供中文版本好评,一直以为 Rin 是题目名字... pdf submit 题解 参考了 东营市胜利第一中学姜志豪 的<网络流的一些建模方法>(2016年信息学奥林匹克中国国家队 ...

  6. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

  7. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  8. loj #2044. 「CQOI2016」手机号码

    #2044. 「CQOI2016」手机号码 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. LibreOJ2044 - 「CQOI2016」手机号码

    Portal Description 给出两个十一位数\(L,R\),求\([L,R]\)内所有满足以下两个条件的数的个数. 出现至少\(3\)个相邻的相同数字: 不能同时出现\(4\)和\(8\). ...

随机推荐

  1. 【学习笔记】《Java编程思想》 第8~11章

    第八章 多态 多态的条件: 1. 要有继承 2.父类对象引用子类对象 3. 要有方法的重写 多态的作用:消除类型之间的耦合关系. 将一个方法调用与一个方法主体关联起来称作绑定.若在程序执行前进行绑定, ...

  2. 吴裕雄 python 机器学习——数据预处理过滤式特征选取SelectPercentile模型

    from sklearn.feature_selection import SelectPercentile,f_classif #数据预处理过滤式特征选取SelectPercentile模型 def ...

  3. Java中查询某个日期下所有时间段的数据

    除了利用时间段进行查询外,还有一个方法: 利用mybatis中的函数,将datetime转为date <if test="purch_date!= null and purch_dat ...

  4. JDK动态代理+反射实现动态修改注解属性值

    这是最近朋友的一个需求,正好闲来无聊有些时间,跟着研究一下,如有不正确的地方,欢迎大家指正~ 一.准备自定义注解 注:如何实现自定义注解,请移步百度. 二.实现 1.实现方式1:通过反射+动态代理动态 ...

  5. linux日常运维工作

    Linux的使用环境也日趋成熟,各种开源产品络绎不绝,大有百花齐放的盛景,那么当Linux落地企业,回归工作时,我们还要面对这Linux运维方面的诸多问题,今天我们特意组织一场有关Linux 在企业运 ...

  6. python进阶(十七)xml(下)

    1.XML简介 xml用到的地方:tomcat配置文件 1) xml 指可扩展标记语言(Extensible Markup Language) 2) xml 被设计用于结构化.存储和传输数据 3) x ...

  7. spring中@Component注解

    1.@controller 控制器(注入服务) 2.@service 业务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spr ...

  8. provide 和 inject高阶使用

    provide 在祖先里授权导出 inject在后代负责接收 foo可以是本组件的函数方法 或者 变量foo 也可以是祖先组件自己 祖先组件foo: this 后代组件 foo.$options.da ...

  9. 洛谷 P3956 棋盘(记忆化搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P3956 这是一道比较好搜的题,注意一些剪枝.预处理和魔法的处理问题(回溯). AC代码: #include<c ...

  10. mysql学习笔记(三):unsigned理解以及特殊情况

    UNSIGNED UNSIGNED属性就是将数字类型无符号化,与C.C++这些程序语言中的unsigned含义相同.例如,INT的类型范围是-2 147 483 648 - 2 147 483 647 ...