最小割树裸题

建树后,以每个点为根跑DFS求出距离矩阵,然后暴力回答询问即可

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. const int maxn=6e2;
  5. const int maxm=4e4;
  6. const int inf=1e13;
  7. int n,m,q;
  8. //for the target graph
  9. vector <pair<int,int> > g[maxn];
  10. void clear1() {
  11. for(int i=1;i<=n;i++) g[i].clear();
  12. }
  13. inline void add(int u,int v,int c) {
  14. g[u].push_back(make_pair(v,c));
  15. }
  16. int cnt,p[maxn],tmp[maxn],S[maxn];
  17. //cnt stands for the first few Uni-blocks
  18. //p[i] represents the number of the point on the i-th point
  19. //tmp array is used to copy the sort p array
  20. //S[u] indicates the Unicom block number where u is in
  21. void clear2() {
  22. cnt=0;
  23. memset(p,0,sizeof p);
  24. memset(tmp,0,sizeof tmp);
  25. memset(S,0,sizeof S);
  26. }
  27. struct GHT {
  28. int s,t,maxFlow,cur[maxn];
  29. int edgeNum=-1,head[maxn],to[maxm<<1],nxt[maxm<<1];
  30. int w[maxm<<1],f[maxm<<1];
  31. GHT() {memset(head,-1,sizeof(head));}
  32. inline void add_edge(int u,int v,int c) {
  33. nxt[++edgeNum]=head[u];head[u]=edgeNum;
  34. to[edgeNum]=v;w[edgeNum]=c;
  35. }
  36. int dep[maxn],gap[maxn];
  37. inline void bfs() {
  38. memset(dep,0,sizeof(dep));memset(gap,0,sizeof(gap));
  39. dep[t]=gap[1]=1;queue<int> Q;Q.push(t);
  40. while(!Q.empty()) { int u=Q.front();Q.pop();
  41. for(int i=head[u];i!=-1;i=nxt[i]) if(!dep[to[i]])
  42. ++gap[dep[to[i]]=dep[u]+1],Q.push(to[i]);
  43. }
  44. }
  45. int dfs(int u,int lastFlow) {
  46. int used=0,minFlow=0;
  47. if(u==t) {maxFlow+=lastFlow;return lastFlow;}
  48. for(int &i=cur[u];i!=-1;i=nxt[i])
  49. if(f[i]&&dep[to[i]]+1==dep[u])
  50. if(minFlow=dfs(to[i],min(lastFlow-used,f[i])))
  51. { f[i]-=minFlow;f[i^1]+=minFlow;
  52. if((used+=minFlow)==lastFlow) return used;
  53. }
  54. if(!(--gap[dep[u]++])) dep[s]=n+1;
  55. ++gap[dep[u]];return used;
  56. }
  57. inline int ISAP(int x,int y) {
  58. for(register int i=0;i<=edgeNum;++i) f[i]=w[i];
  59. maxFlow=0;s=x;t=y;bfs();while(dep[s]<=n) {
  60. for(register int i=0;i<=n;++i) cur[i]=head[i];
  61. dfs(s,inf);
  62. }return maxFlow;
  63. }
  64. void dfs(int u) { S[u]=cnt;
  65. for(int i=head[u];i!=-1;i=nxt[i])
  66. if(f[i]&&S[to[i]]!=cnt) dfs(to[i]);
  67. }
  68. void build(int l,int r) {
  69. if(l>=r) return ;
  70. int x=p[l],y=p[l+1],cut=ISAP(x,y),L=l,R=r;
  71. ++cnt;dfs(x);add(x,y,cut);add(y,x,cut);
  72. for(register int i=l;i<=r;++i) tmp[S[p[i]]==cnt?L++:R--]=p[i];
  73. for(register int i=l;i<=r;++i) p[i]=tmp[i];
  74. build(l,L-1);build(R+1,r);
  75. }
  76. };
  77. int vis[maxn],f[maxn],ans[maxn][maxn];
  78. void clear3() {
  79. memset(vis,0,sizeof vis);
  80. memset(f,0,sizeof f);
  81. memset(ans,0,sizeof ans);
  82. }
  83. void dfs(int p) {
  84. vis[p]=1;
  85. for(int i=0;i<g[p].size();i++) {
  86. if(vis[g[p][i].first]) continue;
  87. f[g[p][i].first]=min(f[p],g[p][i].second);
  88. dfs(g[p][i].first);
  89. }
  90. }
  91. signed main() {
  92. ios::sync_with_stdio(false);
  93. int T;
  94. cin>>T;
  95. while(T--) {
  96. GHT tree;
  97. cin>>n>>m;
  98. for(int i=1;i<=n;i++) p[i]=i; //remember this
  99. for(int i=1;i<=m;i++) {
  100. int t1,t2,t3;
  101. cin>>t1>>t2>>t3;
  102. tree.add_edge(t1,t2,t3);
  103. tree.add_edge(t2,t1,t3);
  104. }
  105. tree.build(1,n);
  106. for(int i=1;i<=n;i++) {
  107. memset(vis,0,sizeof vis);
  108. f[i]=inf;
  109. dfs(i);
  110. for(int j=1;j<=n;j++) {
  111. if(vis[j]) ans[i][j]=f[j];
  112. else ans[i][j]=0;
  113. }
  114. }
  115. cin>>q;
  116. for(int i=1;i<=q;i++) {
  117. int lim;
  118. cin>>lim;
  119. int tot=0;
  120. for(int j=1;j<=n;j++) {
  121. for(int k=1;k<j;k++) {
  122. if(ans[j][k]<=lim) ++tot;
  123. }
  124. }
  125. cout<<tot<<endl;
  126. }
  127. cout<<endl;
  128. clear1();
  129. clear2();
  130. clear3();
  131. }
  132. }

[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. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  2. Linux中screen命令

    screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换.GNU Screen可以看作是窗口管理器的命令行界面版本.它提 ...

  3. PHP0024:PHP 博客项目开发

  4. 不用循环游标,一句update代码实现滚动计算

    发现一段经典SQL,不用循环游标,一句update代码实现滚动计算结存.为方便理解,结合实例测试之 --1,源数据#t1,jcshl初值为每个sid的当前库存数量,要实现的效果:每个sid的后一结存数 ...

  5. node的httpserver简单创建

    1.设计原则为文件夹名字可以依据资源来命名,静态资源统一命名 ps:路径中绝对和相对路径,依据server.js本身的位置而言 const http = require("http" ...

  6. 面向对象编程(什么是对象)——java

    一.什么是面向对象,什么是面向过 二.引入对象和类的概念 对象:是具体事物 如:小明 汽车 类: 是对对象的抽象(抽象 抽出象的部分) Person 先有具体的对象,然后抽象各个对象之间的部分,归纳出 ...

  7. 关键字Lock的简单小例子

    一.什么是Lock? Lock——字面上理解就是锁上:锁住:把……锁起来的意思: 为什么要锁?要锁干什么?——回到现实中可想象到,这个卫生间我要上,其他人不要进来!(所以我要锁住门):又或者土味情话所 ...

  8. Python中关于日期的计算总结

    1.获取当前时间的两种方法: 代码如下: import datetime,timenow = time.strftime("%Y-%m-%d %H:%M:%S")print now ...

  9. Python 测试代码 初学者笔记

    单元测试 每完成一个单元测试,Python都会打印一个字符: 测试通过打印一个句点:测试引发错误打印E:测试导致断言失败打印F 模块unittest import unittest from name ...

  10. kali安装mongodb

    kali安装mongodb 1. 从官网下载需要的安装包 官网下载地址:https://www.mongodb.com/download-center/community 下载完后可以直接用xshel ...