最小割树裸题

建树后,以每个点为根跑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. JavaScript-迭代器模式

    迭代器模式 顺序访问一个集合 使用者无需知道集合内部结构(封装) jQuery 示例 <!DOCTYPE html> <html> <head> <meta ...

  2. 改造SuperMap的DrawHandler接口,自定义绘制的图形样式

    超图WebGL三维接口中有一个绘制的接口(new Cesium.DrawHandler(viewer, mode, clampMode),它封装了绘制完之后的式样,画完之后捕捉绘制完成的实体有一定的难 ...

  3. 【React Native】某个页面禁用物理返回键

    1.引入组件 import { BackHandler, } from 'react-native'; 2.添加监听 componentDidMount(): void { BackHandler.a ...

  4. Android中使用getDrawable时提示:Call requires API level 21(current min is 15)

    场景 在通过getDrawable方法获取照片资源时提示: Call requires API level 21(current min is 15) 注: 博客: https://blog.csdn ...

  5. C#中WinFrom保存文件SaveFileDialog类的使用方法

    C#中WinFrom保存文件SaveFileDialog类的使用方法 使用的命名空间是:System.Windows.Forms; 常用属性:   Title:保存对话框的标题,默认为"另存 ...

  6. css 隐藏滚动条

    如何使用css隐藏滚动条 如何隐藏滚动条,同时仍然可以在任何元素上滚动? 首先,如果需要隐藏滚动条并在内容溢出时显示滚动条,只需要设置overflow:auto样式即可.想要完全隐藏滚动条只需设置ov ...

  7. 记录一个解决IOS极光推送解决问题方法的网址csdn

    https://blog.csdn.net/Three_Zhang/article/details/54667258

  8. 安装vue-devools

    https://blog.csdn.net/weixin_38654336/article/details/80790698

  9. 简述react、redux、react-redux、redux-saga、dva之间的关系

    [react] 定位:React 是一个用于构建用户界面的JavaScript库. 特点:它采用声明范式来描述应用,建立虚拟dom,支持JSX语法,通过react构建组件,能够很好的去复用代码: 缺点 ...

  10. C# MVC Api无法获得参数

    在MVC中写API时,没有收到参数如何解决? 通过jQuery.POST测试成功.后来又通过F12发送,发现始终无法收到参数. 注:我的接口接收参数是一个类对象,没有写[FromBody]) [Htt ...