BZOJ2229—— [Zjoi2011]最小割
0、题目大意:求两点之间的最小割,然后找出其中小于x的数量
1、分析:最小割树水题,上个板子就好
#include <queue>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
#define inf 214748364
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9'){
if(ch == '-') f = -1;
ch = getchar();
}
while('0' <= ch && ch <= '9'){
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
struct Edge{
int from, to, cap, flow, next;
};
int head[310], cur[310];
Edge G[20010];
int tot;
int d[310];
bool vis[310];
int s, t, n, m;
int a[310];
int ans[310][310];
int b[310];
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 Clear(){
for(int i = 0; i <= tot; i += 2){
G[i].flow = G[i ^ 1].flow = (G[i].flow + G[i ^ 1].flow) / 2;
}
}
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 solve(int l, int r){
if(l == r) return;
s = a[l], t = a[r];
Clear();
int tw = maxflow();
memset(vis, 0, sizeof(vis));
DFS(s);
for(int i = 1; i <= n; i ++) if(vis[i]){
for(int j = 1; j <= n; j ++) if(!vis[j]){
ans[i][j] = ans[j][i] = min(ans[i][j], 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(){
int T = read();
while(T --){
n = read(); m = read();
init();
for(int i = 1; i <= m; i ++){
int u = read(), v = read(), w = read();
insert(u, v, w); insert(v, u, w);
}
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++){
ans[i][j] = 214748364;
}
}
for(int i = 1; i <= n; i ++) a[i] = i;
solve(1, n);
int q = read();
while(q --){
LL ret = 0;
int x = read();
for(int i = 1; i <= n; i ++){
for(int j = i + 1; j <= n; j ++){
ret += (ans[i][j] <= x ? 1 : 0);
}
}
printf("%lld\n", ret);
}
puts("");
}
return 0;
}
BZOJ2229—— [Zjoi2011]最小割的更多相关文章
- BZOJ2229: [Zjoi2011]最小割
题解: 真是一道神题!!! 大家还是围观JZP的题解吧(网址找不到了...) 代码: #include<cstdio> #include<cstdlib> #include&l ...
- bzoj千题计划139:bzoj2229: [Zjoi2011]最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- [bzoj2229][Zjoi2011]最小割_网络流_最小割树
最小割 bzoj-2229 Zjoi-2011 题目大意:题目链接. 注释:略. 想法: 在这里给出最小割树的定义. 最小割树啊,就是这样一棵树.一个图的最小割树满足这棵树上任意两点之间的最小值就是原 ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...
- BZOJ2229: [Zjoi2011]最小割(最小割树)
传送门 最小割树 算法 初始时把所有点放在一个集合 从中任选两个点出来跑原图中的最小割 然后按照 \(s\) 集合与 \(t\) 集合的归属把当前集合划分成两个集合,递归处理 这样一共跑了 \(n − ...
- bzoj2229: [Zjoi2011]最小割(最小割树)
传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了……点数那么少……每次跑出一个最大流就暴力搞一遍就好了 //minamoto #includ ...
- 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)
[BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...
- 【BZOJ2229】[Zjoi2011]最小割 最小割树
[BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
随机推荐
- Docker入门教程(二)命令
Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker ...
- c#优化
优化反射 http://kb.cnblogs.com/page/172119/ http://www.2cto.com/kf/201301/182765.html http://blog.sina.c ...
- php返回json数据中文显示的问题
PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE.加上这个选项后,就不会自动把中文编码了. echo json_encode("厦门" ...
- Java数据库——ResultSet接口
使用SQL中的SELECT语句可以查询出数据库的全部结果,在JDBC的操作中数据库的所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容. 从user表中查询数据 //=== ...
- svn 强制用户添加注释 和 允许用户修改注释
当我们用TortoiseSVN提交代码时,有很多人不喜欢写注释,导致以后代码版本多,也不清楚哪个版本到底改了什么东西.所以在提交的时候,我会强制要求添加注释.这是如何实现的?这个话题就涉及到了svn的 ...
- Ad-Hoc命令不熟悉的选项
-f #并发线程数,默认5个线程 --private-key #指定秘钥文件 -k #--ask-pass SSH:认证密码 -K, #--ask-sudo-pass sudo:用户的密码(--sud ...
- LoadRunner 11 安装破解
安装前的准备: 下载地址: A:安装介质 loadrunner-11.iso:http://yunpan.cn/cHN7JpYPi57wL (提取码:79f0) lm70.dll:http://yun ...
- 快速的mysql导入导出数据(load data和outfile)
1.load data: ***实际应用:把日志生成的xls文件load到MySQL中: mysql_cmd = "iconv -c -f utf-8 -t gbk ./data/al_ve ...
- Python操作Redis、Memcache、RabbitMQ、SQLAlchemy
Python操作 Redis.Memcache.RabbitMQ.SQLAlchemy redis介绍:redis是一个开源的,先进的KEY-VALUE存储,它通常被称为数据结构服务器,因为键可以包含 ...
- Effective Objective-C 2.0 — 第一条:了解Objective-C语言的起源
第一条: 了解Objective-C语言的起源 由Smalltalk演化而来,消息型语言的鼻祖(messaging structure)而非 (function calling)函数调用 //Mess ...