最小割树裸题

建树后,以每个点为根跑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] 最小割 - 最小割树的更多相关文章

  1. bzoj2229: [Zjoi2011]最小割(分治最小割+最小割树思想)

    2229: [Zjoi2011]最小割 题目:传送门 题解: 一道非常好的题目啊!!! 蒟蒻的想法:暴力枚举点对跑最小割记录...绝对爆炸啊.... 开始怀疑是不是题目骗人...难道根本不用网络流?? ...

  2. scu - 3254 - Rain and Fgj(最小点权割)

    题意:N个点.M条边(2 <= N <= 1000 , 0 <= M <= 10^5),每一个点有个权值W(0 <= W <= 10^5),现要去除一些点(不能去掉 ...

  3. 算法笔记--最大流和最小割 && 最小费用最大流 && 上下界网络流

    最大流: 给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow). 最小割: 割是网 ...

  4. 3532: [Sdoi2014]Lis 最小字典序最小割

    3532: [Sdoi2014]Lis Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 865  Solved: 311[Submit][Status] ...

  5. HDU 1394 Minimum Inversion Number(最小逆序数 线段树)

    Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...

  6. POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心)-动态规划做法

    POJ 3659 Cell Phone Network / HUST 1036 Cell Phone Network(最小支配集,树型动态规划,贪心) Description Farmer John ...

  7. 【BZOJ2229】[Zjoi2011]最小割 最小割树

    [BZOJ2229][Zjoi2011]最小割 Description 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有 ...

  8. 紫书 例题 11-2 UVa 1395(最大边减最小边最小的生成树)

    思路:枚举所有可能的情况. 枚举最小边, 然后不断加边, 直到联通后, 这个时候有一个生成树.这个时候,在目前这个最小边的情况可以不往后枚举了, 可以直接更新答案后break. 因为题目求最大边减最小 ...

  9. BZOJ2229[Zjoi2011]最小割——最小割树

    题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...

  10. BZOJ.2229.[ZJOI2011]最小割(最小割树)

    题目链接 题意:给定一张无向图,求任意两点之间的最小割. 在所有点中任选两个点作为源点\(S\).汇点\(T\),求它们之间的最小割\(ans\),并把原图分成两个点集\(S',T'\),用\(ans ...

随机推荐

  1. Python3标准库:weakref对象的非永久引用

    1. weakref对象的非永久引用 weakref模块支持对象的弱引用.正常的引用会增加对象的引用数,并避免它被垃圾回收.但结果并不总是如期望中的那样,比如有时可能会出现一个循环引用,或者有时需要内 ...

  2. 复制表结构创建分表 再设置自增ID

    CREATE TABLE table_name1 LIKE table_name ALTER TABLE test AUTO_INCREMENT=x

  3. Cesium案例解析(五)——3DTilesPhotogrammetry摄影测量3DTiles数据

    目录 1. 概述 2. 案例 3. 结果 1. 概述 3D Tiles是用于传输和渲染大规模3D地理空间数据的格式,例如摄影测量,3D建筑,BIM / CAD,实例化特征和点云等.与常规的模型文件格式 ...

  4. RxJava的concat操作符

    更多文章请点击:http://77blogs.com/?p=170 转载请标明出处:https://www.cnblogs.com/tangZH/p/12088332.html,http://77bl ...

  5. opencv —— convexHull 寻找并绘制凸包

    凸包的定义: 包含点集 S 所有点的最小凸多边形称为凸包. 凸包绘制原理:Graham 扫描法 首先选择 y 方向上最低的点作为起始点 p0. 然后以 p0 为原点,建立极坐标系,做逆时针极坐标扫描, ...

  6. The server cannot be started because one or more of the ports are invalid. Open the server editor and correct the invalid ports.

    在eclipse里运行jsp文件最初迟迟没有反应,重启报了这个错误,tomcat的端口设置有问题.需要打开服务器设置一下端口号. 点击Servers,如果没有这一项,按照Window-Show Vie ...

  7. ext4文件系统启动自检的必要性

    最近我们发现多个用户设备掉电后重启,系统不工作. 研究这些返修设备,发现这些设备的表象是网络连接失败,DNS resolve不了.进一步发现/etc/resolv.conf为空,所以应用程序没法进行D ...

  8. PHP0021:PHP COOKIE 设置修改删除

  9. jQuery---事件的执行顺序

    事件的执行顺序 // 1 这个是p自己注册的事件(简单事件) $("p").on("click", function () { alert("呵呵哒& ...

  10. Docker Compose搭建ELK

    Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...