CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)
题目
最小割树模板
算法详解及证明见:
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构造算法)的更多相关文章
- [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)
题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...
- 洛谷P3372线段树模板1——线段树
题目:https://www.luogu.org/problemnew/show/P3372 线段树模板. 代码如下: #include<iostream> #include<cst ...
- 【Luogu】P3384主席树模板(主席树查询K小数)
YEAH!我也是一个AC主席树模板的人了! 其实是个半吊子 我将尽量详细的讲出我的想法. 主席树太难,我们先搞普通线段树好了 普通线段树怎么做?我的想法是查询K次最小值,每次查完把查的数改成INF,查 ...
- 【Luogu】P3380树套树模板(线段树套Splay)
题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- 【bzoj1036】树的统计[ZJOI2008]树链剖分+线段树
题目传送门:1036: [ZJOI2008]树的统计Count 这道题是我第一次打树剖的板子,虽然代码有点长,但是“打起来很爽”,而且整道题只花了不到1.5h+,还是一遍过样例!一次提交AC!(难道前 ...
- BZOJ4519[Cqoi2016]不同的最小割——最小割树+map
题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 所有顶点处在 ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...
随机推荐
- 一起来学Spring Cloud | 第八章:消息总线(Spring Cloud Bus)
上一章节,我们讲解了分布式配置中心spring cloud config,我们把配置项存放在git或者本地,当我们修改配置时,需要重新启动服务才能生效.但是在生产上,一个服务部署了多台机器,重新启动比 ...
- java笔记3
面向对象的特点: 1.封装: 2.继承 3.多态 好处: 是一种符合人们思考习惯的思想 可以将复杂的事情简单化 将程序员从执行者变为指挥者 二 类与对象 成员变量与局部变量的区别: ...
- flask 表单填充数据报错!AttributeError: 'dict' object has no attribute 'getlist'
报错信息: AttributeError: 'dict' object has no attribute 'getlist' 解决: 虽然是小毛病,不得不说还是自己太粗心大意了.
- Ubuntu下载搜狗输入法
实在...因为百度上写的就很好了,所以这里就直接“链”了.. https://jingyan.baidu.com/article/2d5afd6933a67b85a2e28e9f.html
- 【LEETCODE】56、数组分类,适中级别,题目:62、63、1035
package y2019.Algorithm.array.medium; /** * @ClassName UniquePathsWithObstacles * @Description TODO ...
- T100-----调试程序,快速定位到错误行
1.r.d 作业编码 2.ctrl+d3.输入 watch g_errparam.code if g_errparam.code='错误编码', 点几次OK, 再直接run程序,会自动跳 ...
- Js学习04--对象
1.如何辨别js中的对象 除了五种基本的数据类型,其他的都是对象.万物皆对象. 2.Js中对象的分类 1)内建对象 由ES标准定义的对象,在任何的ES实现中都可以使用. eg:String.Numbe ...
- Matalb中英双语手册-年少无知翻译版本
更新: 20171207: 这是大学期间参加数模翻译的手册 正文: 愚人节快乐,突然发现自己在博客园的一篇文章.摘取如下: MATLAB 语言是一种工程语言,语法很像 VB 和 C,比 R 语言容易学 ...
- redis持久化机制和内存管理
redis持久化方式有两种:RDB方式和AOF方式 1.RDB方式:内存快照,在指定的时间间隔对数据进行快照存储,支持在客户端直接BGSAVE或者SAVE命令来创建一个内存快照,BGSAVE会fork ...
- openssl jia adress
???????????????????????????????????????????openssl证IP 首先创建openssl.cnf, 内容如下. 其中organizationalUnitNam ...