BZOJ4519——[cqoi2016]不同的最小割
0、题意:求两点之间的最小割的不同的总量
1、分析:裸的分治+最小割,也叫最小割树或GH树,最后用set搞一下就好
#include <set>
#include <queue>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
#define inf 214748364
struct Edge{
int from, to, cap, flow, next;
};
int head[1010], cur[1010];
Edge G[40010];
int tot;
int d[1010];
bool vis[1010];
int s, t, n, m;
int a[1010];
int b[1010];
inline void init(){
memset(head, -1, sizeof(head));
tot = -1;
return;
}
inline void insert(int from, int to, int cap){
G[++ tot] = (Edge){from, to, cap, 0, head[from]};
head[from] = tot;
G[++ tot] = (Edge){to, from, 0, 0, head[to]};
head[to] = tot;
return;
}
inline bool BFS(){
memset(vis, 0, sizeof(vis));
queue<int> Q;
Q.push(s);
vis[s]=1;
d[s]=0;
while(!Q.empty()){
int x = Q.front(); Q.pop();
for(int i = head[x]; i != -1; i = G[i].next){
Edge& e = G[i];
if(e.cap - e.flow > 0 && !vis[e.to]){
vis[e.to] = 1;
d[e.to]=d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
inline int dfs(int x, int a){
if(x == t || a == 0) return a;
int flow = 0, f;
for(int& i = cur[x]; i != -1; i = G[i].next){
Edge& e = G[i];
if(d[x]+1 == d[e.to] && (f = dfs(e.to, min(e.cap - e.flow, a))) > 0){
e.flow += f;
G[i ^ 1].flow -= f;
flow += f;
a -= f;
if(a == 0) break;
}
}
return flow;
}
inline int maxflow(){
int res = 0;
while(BFS()){
for(int i = 1; i <= n; i ++) cur[i] = head[i];
res += dfs(s, inf);
}
return res;
}
inline void DFS(int x){
vis[x] = 1;
for(int i = head[x]; i != -1; i = G[i].next) if(!vis[G[i].to] && G[i].cap > G[i].flow){
DFS(G[i].to);
}
}
inline void Clear(){
for(int i = 0; i <= tot; i += 2){
G[i].flow = G[i ^ 1].flow = (G[i].flow + G[i ^ 1].flow) / 2;
}
}
set<int> Set;
inline void solve(int l, int r){
if(l == r) return;
s = a[l], t = a[r];
Clear();
int tw = maxflow();
Set.insert(tw);
int L = l, R = r;
for(int i = l; i <= r; i ++){
if(vis[a[i]]) b[L ++] = a[i];
else b[R --] = a[i];
}
for(int i = l; i <= r; i ++) a[i] = b[i];
solve(l, L - 1); solve(L, r);
}
int main(){
scanf("%d%d", &n, &m);
init();
for(int i = 1; i <= m; i ++){
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
insert(u, v, w); insert(v, u, w);
}
for(int i = 1; i <= n; i ++) a[i] = i;
solve(1, n);
printf("%d\n", Set.size());
return 0;
}
BZOJ4519——[cqoi2016]不同的最小割的更多相关文章
- bzoj千题计划140:bzoj4519: [Cqoi2016]不同的最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=4519 最小割树 #include<queue> #include<cstdio&g ...
- bzoj4519: [Cqoi2016]不同的最小割(分治最小割)
4519: [Cqoi2016]不同的最小割 题目:传送门 题解: 同BZOJ 2229 基本一样的题目啊,就最后用set记录一下就ok 代码: #include<cstdio> #inc ...
- [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树
不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...
- BZOJ4519 CQOI2016不同的最小割(最小割+分治)
最小割树:新建一个图,包含原图的所有点,初始没有边.任取两点跑最小割,给两点连上权值为最小割的边,之后对于两个割集分别做同样的操作.最后会形成一棵树,树上两点间路径的最小值即为两点最小割.证明一点都不 ...
- BZOJ4519: [Cqoi2016]不同的最小割
Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 ...
- BZOJ4519[Cqoi2016]不同的最小割——最小割树+map
题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 所有顶点处在 ...
- bzoj4519: [Cqoi2016]不同的最小割(最小割树)
传送门 好神仙……最小割树是个什么东西…… 其实我觉得干脆直接$O(n^2)$跑几个dinic算了…… 来说一下这个叫最小割树的神奇东西 我们先建一个$n$个点,没有边的无向图 在原图中任选两点$s, ...
- 【BZOJ4519】[Cqoi2016]不同的最小割 最小割树
[BZOJ4519][Cqoi2016]不同的最小割 Description 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分 ...
- 【BZOJ-4519】不同的最小割 最小割树(分治+最小割)
4519: [Cqoi2016]不同的最小割 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 393 Solved: 239[Submit][Stat ...
随机推荐
- mysql support chinese
1.创建table的时候使用utf8编码 create table tablename ( id int NOT NULL, content var_char(250) NOT NULL, CON ...
- TCP 介绍
TCP介绍 TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络O ...
- JS-百钱买百鸡案例-for循环制作
<html> <head> <meta charset="utf-8"/> <title></title> <sc ...
- properties 配置文件中值换行的问题
在使用properties配置文件的时候我们经常碰到如下两个问题 1:当a=b中的b值内容特别长的时候为了阅读方便我们手动换行,但如果我们直接回车那么后面的数据就会丢失.那如何解决呢? 例如: a=a ...
- linq 之 Distinct的使用
public class Product { public string Name { get;set;} public int Code { get; set; } } class ProductC ...
- JavaWeb学习笔记——表达式语言
使用表达式语言,可以方便地访问标志位(JSP中有page(pageContext).request.session和application4种标志位)中的属性内容,可以避免出现许多的Scriptlet ...
- Java链表
链表的每一个节点中除了要保存本身的内容之后,还要保存下一个节点的引用 简单的建立一个链表,表头是root //============================================= ...
- Iframe 在项目中的使用总结
参考:http://www.cnblogs.com/MaxIE/archive/2008/08/13/1266597.html 问题一:首先我们用iframe加载页面,第一个需要解决的问题是高度自适应 ...
- Sencha Touch 2.2 Store Proxy 异常监控
移动端到服务端通信往往会发生很多莫名的异常情况,如何有效的监控proxy异常,给用户友好的用户体验呢? Proxy给我提供了异常exception的监听事件,只需要监控该项目即可. Sencha To ...
- input的onkeyup效果 超级简短代码
效果代码 title="请输入正确的十六位数字" onkeyup="javascript: return this.value = this.value.toUpperC ...