题目

最小割树模板

算法详解及证明见:

2016年国家队候选队员论文

《浅谈无向图最小割问题的一些算法及应用——绍兴一中 王文涛》

3.2节

CODE

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. template<class T>inline void read(T &x) {
  4. char ch; while(!isdigit(ch=getchar()));
  5. for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
  6. }
  7. const int MAXN = 855;
  8. const int MAXM = 8505;
  9. const int inf = 1e9;
  10. int n, m, Q;
  11. int info[MAXN], fir[MAXN], to[MAXM<<1], nxt[MAXM<<1], c[MAXM<<1], C[MAXM<<1], cnt;
  12. inline void link(int u, int v, int cc, int rc) {
  13. to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; C[cnt] = cc;
  14. to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt; C[cnt] = rc;
  15. }
  16. int dis[MAXN];
  17. queue<int>q;
  18. int S, T;
  19. bool bfs() {
  20. memset(dis, -1, sizeof dis);
  21. dis[S] = 0; q.push(S);
  22. while(!q.empty()) {
  23. int u = q.front(); q.pop();
  24. for(int i = fir[u], v; i; i = nxt[i])
  25. if(c[i] && !(~dis[v=to[i]]))
  26. dis[v] = dis[u] + 1, q.push(v);
  27. }
  28. return ~dis[T];
  29. }
  30. bool vis[MAXN];
  31. int aug(int u, int Max) {
  32. if(u == T) return Max;
  33. int delta, flow = 0;
  34. vis[u] = 1;
  35. for(int v, &i = info[u]; i; i = nxt[i])
  36. if(c[i] && !vis[v=to[i]] && dis[v] == dis[u]+1 && (delta=aug(v, min(Max-flow, c[i])))) {
  37. c[i] -= delta; c[i^1] += delta; flow += delta;
  38. if(flow == Max) break;
  39. }
  40. vis[u] = 0;
  41. return flow;
  42. }
  43. int maxflow(int ss, int tt) {
  44. S = ss, T = tt;
  45. int re = 0;
  46. while(bfs()) memcpy(info, fir, sizeof info), re += aug(S, inf);
  47. return re;
  48. }
  49. int fa[MAXN], val[MAXN], ans[MAXN][MAXN], seq[MAXN*MAXN], cur;
  50. void dfs(int u) {
  51. if(vis[u]) return;
  52. vis[u] = 1;
  53. for(int i = fir[u]; i; i = nxt[i])
  54. if(c[i]) dfs(to[i]);
  55. }
  56. vector<pair<int,int> >e[MAXN];
  57. void getans(int u, int ff, int now, int s) {
  58. ans[s][u] = now;
  59. for(int i = e[u].size()-1, v; i >= 0; --i)
  60. if((v=e[u][i].first) != ff)
  61. getans(v, u, min(now, e[u][i].second), s);
  62. }
  63. int main () {
  64. read(n), read(m); cnt = 1;
  65. for(int i = 1, u, v, c; i <= m; ++i) {
  66. read(u), read(v), read(c);
  67. link(u, v, c, c);
  68. }
  69. fa[1] = 0;
  70. for(int i = 2; i <= n; ++i) fa[i] = 1;
  71. for(int i = 2; i <= n; ++i) {
  72. memcpy(c, C, sizeof c);
  73. val[i] = maxflow(i, fa[i]);
  74. dfs(i);
  75. for(int j = i+1; j <= n; ++j)
  76. if(vis[j] && fa[i] == fa[j]) fa[j] = i;
  77. memset(vis, 0, sizeof vis);
  78. }
  79. for(int i = 2; i <= n; ++i)
  80. e[fa[i]].push_back(make_pair(i, val[i])),
  81. e[i].push_back(make_pair(fa[i], val[i]));
  82. cur = 0;
  83. for(int i = 1; i <= n; ++i) {
  84. getans(i, 0, inf, i);
  85. for(int j = i+1; j <= n; ++j)
  86. seq[++cur] = ans[i][j];
  87. }
  88. sort(seq + 1, seq + cur + 1);
  89. cur = unique(seq + 1, seq + cur + 1) - seq - 1;
  90. printf("%d\n", cur);
  91. }

CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)的更多相关文章

  1. [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)

    题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...

  2. 洛谷P3372线段树模板1——线段树

    题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...

  3. 【Luogu】P3384主席树模板(主席树查询K小数)

    YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...

  4. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

  5. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  6. hdu 2665 Kth number(划分树模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ]  改变一下输入就可以过 http://poj.org/problem? ...

  7. 【bzoj1036】树的统计[ZJOI2008]树链剖分+线段树

    题目传送门:1036: [ZJOI2008]树的统计Count 这道题是我第一次打树剖的板子,虽然代码有点长,但是“打起来很爽”,而且整道题只花了不到1.5h+,还是一遍过样例!一次提交AC!(难道前 ...

  8. BZOJ4519[Cqoi2016]不同的最小割——最小割树+map

    题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 所有顶点处在 ...

  9. BZOJ2229[Zjoi2011]最小割——最小割树

    题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...

随机推荐

  1. HDFS面试题

    hadoop节点动态上线下线怎么操作? )节点上线操作: 当要新上线数据节点的时候,需要把数据节点的名字追加在 dfs.hosts 文件中 ()关闭新增节点的防火墙 ()在 NameNode 节点的 ...

  2. python学习-37 其他的文件处理方法

    f = open('test.txt','r+',encoding='utf-8') f.flush() # 刷新 f.readline() print(f.tell()) # 说明光标位置在哪里 ( ...

  3. Python规范:代码规范要注意

    主要有以下两种代码规范 <8 号 Python 增强规范>(Python Enhacement Proposal #8),以下简称 PEP8: <Google Python 风格规范 ...

  4. SQL——函数

    演示c_grade表 一.AVG() AVG()函数用于返回数值列的平均值 例: SELECT AVG(score) FROM c_grade; 运行结果: 通过运行结果可以看到,score字段为Nu ...

  5. golang 执行命令行(二)--修改进程启动用户

    继续上文所述,有时候我们需要设置进程的启动用户,操作与设置进程组的方式类似,不多说直接上代码: // 修改进程的执行用户 func withUserAttr(cmd *exec.Cmd, name s ...

  6. centos7+ 在线yum安装docker-ce

    yum install -y yum-utils   //扩展yum功能 yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ...

  7. Eclipse 安装反编译插件 Eclipse Class Decompiler

    Eclipse Class Decompiler在线安装方法 https://blog.csdn.net/tangjinquan1157/article/details/77506015 Eclips ...

  8. .net core使用ocelot---第五篇 服务质量

    简介 .net core使用ocelot---第一篇 简单使用  .net core使用ocelot---第二篇 身份验证使用 .net core使用ocelot---第三篇 日志记录  .net c ...

  9. 主机与虚拟机ping不通问题

    在win10 上利用vm安装linux虚拟机,物理机与虚拟机之间不能ping通,除了检查物理机与虚拟机防火墙状态外,还要注意物理机设置的ip与虚拟机设置的ip,要在同一个ip段

  10. 视频质量评估 之 VMAF

    VMAF 方法: 基本想法: 面对不同特征的源内容.失真类型,以及扭曲程度,每个基本指标各有优劣.通过使用机器学习算法(支持向量机(Support Vector Machine,SVM)回归因子)将基 ...