[ZJOI2011] 最小割 - 最小割树
最小割树裸题
建树后,以每个点为根跑DFS求出距离矩阵,然后暴力回答询问即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=6e2;
const int maxm=4e4;
const int inf=1e13;
int n,m,q;
//for the target graph
vector <pair<int,int> > g[maxn];
void clear1() {
for(int i=1;i<=n;i++) g[i].clear();
}
inline void add(int u,int v,int c) {
g[u].push_back(make_pair(v,c));
}
int cnt,p[maxn],tmp[maxn],S[maxn];
//cnt stands for the first few Uni-blocks
//p[i] represents the number of the point on the i-th point
//tmp array is used to copy the sort p array
//S[u] indicates the Unicom block number where u is in
void clear2() {
cnt=0;
memset(p,0,sizeof p);
memset(tmp,0,sizeof tmp);
memset(S,0,sizeof S);
}
struct GHT {
int s,t,maxFlow,cur[maxn];
int edgeNum=-1,head[maxn],to[maxm<<1],nxt[maxm<<1];
int w[maxm<<1],f[maxm<<1];
GHT() {memset(head,-1,sizeof(head));}
inline void add_edge(int u,int v,int c) {
nxt[++edgeNum]=head[u];head[u]=edgeNum;
to[edgeNum]=v;w[edgeNum]=c;
}
int dep[maxn],gap[maxn];
inline void bfs() {
memset(dep,0,sizeof(dep));memset(gap,0,sizeof(gap));
dep[t]=gap[1]=1;queue<int> Q;Q.push(t);
while(!Q.empty()) { int u=Q.front();Q.pop();
for(int i=head[u];i!=-1;i=nxt[i]) if(!dep[to[i]])
++gap[dep[to[i]]=dep[u]+1],Q.push(to[i]);
}
}
int dfs(int u,int lastFlow) {
int used=0,minFlow=0;
if(u==t) {maxFlow+=lastFlow;return lastFlow;}
for(int &i=cur[u];i!=-1;i=nxt[i])
if(f[i]&&dep[to[i]]+1==dep[u])
if(minFlow=dfs(to[i],min(lastFlow-used,f[i])))
{ f[i]-=minFlow;f[i^1]+=minFlow;
if((used+=minFlow)==lastFlow) return used;
}
if(!(--gap[dep[u]++])) dep[s]=n+1;
++gap[dep[u]];return used;
}
inline int ISAP(int x,int y) {
for(register int i=0;i<=edgeNum;++i) f[i]=w[i];
maxFlow=0;s=x;t=y;bfs();while(dep[s]<=n) {
for(register int i=0;i<=n;++i) cur[i]=head[i];
dfs(s,inf);
}return maxFlow;
}
void dfs(int u) { S[u]=cnt;
for(int i=head[u];i!=-1;i=nxt[i])
if(f[i]&&S[to[i]]!=cnt) dfs(to[i]);
}
void build(int l,int r) {
if(l>=r) return ;
int x=p[l],y=p[l+1],cut=ISAP(x,y),L=l,R=r;
++cnt;dfs(x);add(x,y,cut);add(y,x,cut);
for(register int i=l;i<=r;++i) tmp[S[p[i]]==cnt?L++:R--]=p[i];
for(register int i=l;i<=r;++i) p[i]=tmp[i];
build(l,L-1);build(R+1,r);
}
};
int vis[maxn],f[maxn],ans[maxn][maxn];
void clear3() {
memset(vis,0,sizeof vis);
memset(f,0,sizeof f);
memset(ans,0,sizeof ans);
}
void dfs(int p) {
vis[p]=1;
for(int i=0;i<g[p].size();i++) {
if(vis[g[p][i].first]) continue;
f[g[p][i].first]=min(f[p],g[p][i].second);
dfs(g[p][i].first);
}
}
signed main() {
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--) {
GHT tree;
cin>>n>>m;
for(int i=1;i<=n;i++) p[i]=i; //remember this
for(int i=1;i<=m;i++) {
int t1,t2,t3;
cin>>t1>>t2>>t3;
tree.add_edge(t1,t2,t3);
tree.add_edge(t2,t1,t3);
}
tree.build(1,n);
for(int i=1;i<=n;i++) {
memset(vis,0,sizeof vis);
f[i]=inf;
dfs(i);
for(int j=1;j<=n;j++) {
if(vis[j]) ans[i][j]=f[j];
else ans[i][j]=0;
}
}
cin>>q;
for(int i=1;i<=q;i++) {
int lim;
cin>>lim;
int tot=0;
for(int j=1;j<=n;j++) {
for(int k=1;k<j;k++) {
if(ans[j][k]<=lim) ++tot;
}
}
cout<<tot<<endl;
}
cout<<endl;
clear1();
clear2();
clear3();
}
}
[ZJOI2011] 最小割 - 最小割树的更多相关文章
- bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)
2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...
- scu - 3254 - Rain and Fgj(最小点权割)
题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...
- 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流
最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...
- 3532: [Sdoi2014]Lis 最小字典序最小割
3532: [Sdoi2014]Lis Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 865 Solved: 311[Submit][Status] ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
- POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法
POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...
- 【BZOJ2229】[Zjoi2011]最小割 最小割树
[BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...
- 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)
思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...
- BZOJ.2229.[ZJOI2011]最小割(最小割树)
题目链接 题意:给定一张无向图,求任意两点之间的最小割. 在所有点中任选两个点作为源点\(S\).汇点\(T\),求它们之间的最小割\(ans\),并把原图分成两个点集\(S',T'\),用\(ans ...
随机推荐
- iis添加asp.net网站,访问提示:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射
今天在iis服务器配置asp.net网站,遇到一个问题,记录一下: 问题:由于扩展配置问题而无法提供您请求的页面.如果该页面是脚本,请添加处理程序.如果应下载文件,请添加 MIME 映射. Windo ...
- C# 8.0 新特性之二:接口默认实现
在C#8.0中,针对接口引入了一项新特性,就是可以指定默认实现,方便对已有实现进行扩展,也对面向Android和Swift的Api进行互操作提供了可能性.下面我们来看看该特性的的概念.规 ...
- redis 5.0.7 源码阅读——压缩列表ziplist
redis中压缩列表ziplist相关的文件为:ziplist.h与ziplist.c 压缩列表是redis专门开发出来为了节约内存的内存编码数据结构.源码中关于压缩列表介绍的注释也写得比较详细. 一 ...
- mysql必知必会--创建计算字段
计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式.下面举 几个例子. * 如果想在一个字段中既显示公司名,又显示公司的地址,但这两 个信息一般包含在不同的表列中. * 城市.州和邮政编码存 ...
- OBS使用教程
OBS使用教程 OBS使用教程:录屏热键的设置 视频:基础画布分辨率1920/1080 1366,768输出缩放分辨率常用FPS值 30或者60 输出:输出模式:高级录像:编码器x264码率控制 CB ...
- notepad中运行python, --kali安装后出现乱码
notepad中运行python cmd /k python "$(FULL_CURRENT_PATH)" & ECHO. & PAUSE & EXIT - ...
- cf999E (强联通分量模板题)
给出n个点m条边的有向图,问至少添加多少条边使得任何点都可以从s点出发可达 #include<bits/stdc++.h> #define forn(i, n) for (int i = ...
- 接口文档word版
一. 分类中某某某接口 接口说明: 请求URL: http://120.26.212.11:8199/xhcms/catalogFirst 请求参数说明: 参数名 必选 类型 参数说明 返回: {&q ...
- setter&getter
let _age = 4 class Animal { construct (type){ this.type = type } get age(){ return _age } set age(va ...
- day36_tomcat丶servlet入门
web相关概念回顾 软件架构 常见的软件结构有下面2种 Client/Server 客户端/服务器端 简称C/S 特点:在用户本地有一个客户端程序,在远程有一个服务器端程序 如:QQ,迅雷...等等 ...