题目

最小割树模板

算法详解及证明见:

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. 解决计算精度问题:BigDecimal

    BigDecimal类 BigDecimal所在包:java.math,不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 ...

  2. Spring Boot取消默认tomcat启动,打成war包发布到服务器运行

    一.设置打包方式 在pom.xml中设置打包格式 <packaging>war</packaging> 二.取消Spring Boot的tomcat <!--部署成war ...

  3. Redis-缓存有效期与淘汰策略

    Redis-缓存有效期与淘汰策略 有效期 节省空间 做到数据弱一致性,有效期失效后,可以保证数据的一致性 过期策略 Redis过期策略通常有三种: 1.定时过期: 每个设置过期时间的Key,系统还要生 ...

  4. Js学习04--对象

    1.如何辨别js中的对象 除了五种基本的数据类型,其他的都是对象.万物皆对象. 2.Js中对象的分类 1)内建对象 由ES标准定义的对象,在任何的ES实现中都可以使用. eg:String.Numbe ...

  5. 物流管理系统(SSM+vue+shiro)【前后台】

    一.简单介绍项目 该项目是属于毕业设计项目之一,有前台的用户下单.有司机进行接单.有管理员进行操作后台,直接进入主题 毕设.定制开发 联系QQ:761273133 登录主页: 手机号码+验证码登录 或 ...

  6. 无法将文件xxx复制到xxx文件xxx正由另一进程使用,因此该进程无法访问此文件

    对于VS2017,可以这样处理,开始——>运行——>tskill msbuild,然后重新生成即可.

  7. 【转载】 C#中List集合使用First()方法获取第一个元素

    在C#的List集合操作过程中,如果要获取List集合中的第一个元素对象,则一般会先通过获取到list[0]这种方式来获取第一个元素.其实在List集合中提供了获取最后一个元素的First()方法,调 ...

  8. 手写DAO框架(六)-框架使用示例

    一.引入pom <dependency> <groupId>me.lovegao</groupId> <artifactId>gdao</arti ...

  9. head引入样式

    引入CSS(base基础样式,index页面样式): <link rel="stylesheet" type="text/css" href=" ...

  10. JAVA基础之ServletContext对象

    个人理解:  ServletContext类似字节码文件对象,在web创建的时候就自动生成了,并且是唯一的,跟随着项目和服务器共存亡了.通过这个对象,我们可以向里面存数据(键值对),也可以通过别的Se ...