题目

最小割树模板

算法详解及证明见:

2016年国家队候选队员论文

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

3.2节

CODE

#include <bits/stdc++.h>
using namespace std;
template<class T>inline void read(T &x) {
char ch; while(!isdigit(ch=getchar()));
for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
}
const int MAXN = 855;
const int MAXM = 8505;
const int inf = 1e9;
int n, m, Q;
int info[MAXN], fir[MAXN], to[MAXM<<1], nxt[MAXM<<1], c[MAXM<<1], C[MAXM<<1], cnt;
inline void link(int u, int v, int cc, int rc) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; C[cnt] = cc;
to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt; C[cnt] = rc;
}
int dis[MAXN];
queue<int>q;
int S, T;
bool bfs() {
memset(dis, -1, sizeof dis);
dis[S] = 0; q.push(S);
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = fir[u], v; i; i = nxt[i])
if(c[i] && !(~dis[v=to[i]]))
dis[v] = dis[u] + 1, q.push(v);
}
return ~dis[T];
}
bool vis[MAXN];
int aug(int u, int Max) {
if(u == T) return Max;
int delta, flow = 0;
vis[u] = 1;
for(int v, &i = info[u]; i; i = nxt[i])
if(c[i] && !vis[v=to[i]] && dis[v] == dis[u]+1 && (delta=aug(v, min(Max-flow, c[i])))) {
c[i] -= delta; c[i^1] += delta; flow += delta;
if(flow == Max) break;
}
vis[u] = 0;
return flow;
}
int maxflow(int ss, int tt) {
S = ss, T = tt;
int re = 0;
while(bfs()) memcpy(info, fir, sizeof info), re += aug(S, inf);
return re;
}
int fa[MAXN], val[MAXN], ans[MAXN][MAXN], seq[MAXN*MAXN], cur;
void dfs(int u) {
if(vis[u]) return;
vis[u] = 1;
for(int i = fir[u]; i; i = nxt[i])
if(c[i]) dfs(to[i]);
}
vector<pair<int,int> >e[MAXN];
void getans(int u, int ff, int now, int s) {
ans[s][u] = now;
for(int i = e[u].size()-1, v; i >= 0; --i)
if((v=e[u][i].first) != ff)
getans(v, u, min(now, e[u][i].second), s);
}
int main () {
read(n), read(m); cnt = 1;
for(int i = 1, u, v, c; i <= m; ++i) {
read(u), read(v), read(c);
link(u, v, c, c);
}
fa[1] = 0;
for(int i = 2; i <= n; ++i) fa[i] = 1;
for(int i = 2; i <= n; ++i) {
memcpy(c, C, sizeof c);
val[i] = maxflow(i, fa[i]);
dfs(i);
for(int j = i+1; j <= n; ++j)
if(vis[j] && fa[i] == fa[j]) fa[j] = i;
memset(vis, 0, sizeof vis);
}
for(int i = 2; i <= n; ++i)
e[fa[i]].push_back(make_pair(i, val[i])),
e[i].push_back(make_pair(fa[i], val[i]));
cur = 0;
for(int i = 1; i <= n; ++i) {
getans(i, 0, inf, i);
for(int j = i+1; j <= n; ++j)
seq[++cur] = ans[i][j];
}
sort(seq + 1, seq + cur + 1);
cur = unique(seq + 1, seq + cur + 1) - seq - 1;
printf("%d\n", cur);
}

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. Prometheus入门到放弃(5)之AlertManager部署

    alertmanager与exporters.cadvisor一样,都是独立于prometheus项目,这里我们也使用docker方式部署alertmanager. 1.下载镜像 镜像地址:https ...

  2. Apache Kafka教程

    1.卡夫卡教程 今天,我们正在使用Apache Kafka Tutorial开始我们的新旅程.在这个Kafka教程中,我们将看到什么是Kafka,Apache Kafka历史以及Kafka的原因.此外 ...

  3. springcloud使用之服务的注册发现与消费

    随着spring的发展我们发现spring提供了越来越多的项目来帮我们简化框架的搭建,使我们站在巨人的肩膀行走,让我们更关注于开发我们的逻辑.随着技术的更替,我们的新项目也逐渐使用了springboo ...

  4. C++学习笔记 之 循环

    循环 循环语句允许我们多次执行一个语句或者语句组.(插入流程图) 循环类型 C++为我们提供的循环类型如下: 循环类型 描述 while循环 当给定条件为真时,重复语句或语句组.它会在执行循环主体之前 ...

  5. Xcode中提高效率的快捷键

    依稀记得大神都是使用超多的快捷键来开发的.虽然要成为大神的路很远,不过把下面这些快捷键用熟练,就相当于把宝剑磨的既快又光,相当于有了一件极品的装备,对于接下来的打(升)怪(职)升(加)级(薪)那肯定是 ...

  6. 可能这些是你想要的H5软键盘兼容方案

    前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...

  7. redis HyperLogLog的使用

    一.概念1.redis在2.8.9版本添加了HyperLogLog结构.2.redis HyperLogLog是用来做基数统计的算法,HyperLogLog的优点是:在输入元素的数量或者体积非常非常大 ...

  8. React 了解学习

    1.nodejs安装程序https://nodejs.org/en/download/ create-react-app 类似 vs2017开发工具,集成了webpack 打包发布,loader和默认 ...

  9. centos 7 安装nginx并启动(笔记)

    参考 https://www.cnblogs.com/liujuncm5/p/6713784.html Nginx 是 C语言 开发 一. gcc 安装安装 nginx 需要先将官网下载的源码进行编译 ...

  10. Java开发环境搭建(二):环境变量配置

    如果不配置环境变量,java 命令就只能在 bin 目录下才能使用,而且很多Java软件也需要在配置JAVA_HOME和PATH的状态下才能运行.为了在任何目录下都可以使用 java 命令.保证程序正 ...