没事干写一发模板。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<map>
  8. using namespace std;
  9. int read()
  10. {
  11. int x=,f=;char c=getchar();
  12. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  13. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  14. return x*f;
  15. }
  16. #define N 510
  17. #define M 1600
  18. #define inf 1000000000
  19. int n,m,p[N],v[N],u[N],tot=,t=-;
  20. bool flag[N];
  21. int d[N],cur[N],q[N];
  22. struct data{int to,nxt,cap,flow;
  23. }edge[M<<];
  24. map<int,bool> f;
  25. namespace tree
  26. {
  27. int p[N],fa[N],deep[N],len[N],t=;
  28. struct data{int to,nxt,len;}edge[M<<];
  29. void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
  30. void dfs(int k)
  31. {
  32. for (int i=p[k];i;i=edge[i].nxt)
  33. if (edge[i].to!=fa[k])
  34. {
  35. deep[edge[i].to]=deep[k]+;
  36. fa[edge[i].to]=k;
  37. len[edge[i].to]=edge[i].len;
  38. dfs(edge[i].to);
  39. }
  40. }
  41. void solve(int q)
  42. {
  43. while (q--)
  44. {
  45. int x=read(),y=read(),ans=;
  46. if (deep[x]<deep[y]) swap(x,y);
  47. while (deep[x]>deep[y]) ans=min(ans,len[x]),x=fa[x];
  48. while (x!=y) ans=min(ans,len[x]),ans=min(ans,len[y]),x=fa[x],y=fa[y];
  49. printf("%d\n",ans);
  50. }
  51. }
  52. }
  53. void addedge(int x,int y,int z)
  54. {
  55. t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,p[x]=t;
  56. }
  57. bool bfs(int S,int T)
  58. {
  59. memset(d,,sizeof(d));d[S]=;
  60. int head=,tail=;q[]=S;
  61. do
  62. {
  63. int x=q[++head];
  64. for (int i=p[x];~i;i=edge[i].nxt)
  65. if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
  66. {
  67. d[edge[i].to]=d[x]+;
  68. q[++tail]=edge[i].to;
  69. }
  70. }while (head<tail);
  71. return ~d[T];
  72. }
  73. int work(int k,int T,int f)
  74. {
  75. if (k==T) return f;
  76. int used=;
  77. for (int i=cur[k];~i;i=edge[i].nxt)
  78. if (d[k]+==d[edge[i].to])
  79. {
  80. int w=work(edge[i].to,T,min(f-used,edge[i].cap-edge[i].flow));
  81. edge[i].flow+=w,edge[i^].flow-=w;
  82. if (edge[i].flow<edge[i].cap) cur[k]=i;
  83. used+=w;if (used==f) return f;
  84. }
  85. if (used==) d[k]=-;
  86. return used;
  87. }
  88. void dinic(int S,int T)
  89. {
  90. for (int i=;i<=t;i++) edge[i].flow=;
  91. int ans=;
  92. while (bfs(S,T))
  93. {
  94. memcpy(cur,p,sizeof(p));
  95. ans+=work(S,T,inf);
  96. }
  97. tree::addedge(S,T,ans);
  98. }
  99. void dfs(int k)
  100. {
  101. flag[k]=;
  102. for (int i=p[k];~i;i=edge[i].nxt)
  103. if (!flag[edge[i].to]&&edge[i].flow<edge[i].cap)
  104. dfs(edge[i].to);
  105. }
  106. void solve(int l,int r)
  107. {
  108. if (l>=r) return;
  109. dinic(v[l],v[r]);
  110. memset(flag,,sizeof(flag));
  111. dfs(v[l]);
  112. int cnt=l-;
  113. for (int i=l;i<=r;i++)
  114. if (flag[v[i]]) u[++cnt]=v[i];
  115. cnt=r+;
  116. for (int i=l;i<=r;i++)
  117. if (!flag[v[i]]) u[--cnt]=v[i];
  118. for (int i=l;i<=r;i++) v[i]=u[i];
  119. solve(l,cnt-);
  120. solve(cnt,r);
  121. }
  122. int main()
  123. {
  124. #ifndef ONLINE_JUDGE
  125. freopen("mincuttree.in","r",stdin);
  126. freopen("mincuttree.out","w",stdout);
  127. const char LL[]="%I64d\n";
  128. #else
  129. const char LL[]="%lld\n";
  130. #endif
  131. n=read(),m=read();
  132. memset(p,,sizeof(p));
  133. for (int i=;i<=m;i++)
  134. {
  135. int x=read(),y=read(),z=read();
  136. addedge(x,y,z),addedge(y,x,z);
  137. }
  138. for (int i=;i<=n;i++) v[i]=i;
  139. solve(,n);
  140. tree::dfs();
  141. int q=read();
  142. tree::solve(q);
  143. return ;
  144. }

Luogu4897 【模板】最小割树的更多相关文章

  1. [模板]最小割树(Gomory-Hu Tree)(luogu4897)

    给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不连通 Input 第一行两个数\ ...

  2. 洛谷.4897.[模板]最小割树(Dinic)

    题目链接 最小割树模板.具体见:https://www.cnblogs.com/SovietPower/p/9734013.html. ISAP不知为啥T成0分了.. Dinic: //1566ms ...

  3. CQOI2016 不同的最小割 (最小割树模板)(等价流树的Gusfield构造算法)

    题目 最小割树模板 算法详解及证明见: 2016年国家队候选队员论文 <浅谈无向图最小割问题的一些算法及应用--绍兴一中 王文涛> 3.2节 CODE #include <bits/ ...

  4. 【模板】最小割树(Gomory-Hu Tree)

    传送门 Description 给定一个\(n\)个点\(m\)条边的无向连通图,多次询问两点之间的最小割 两点间的最小割是这样定义的:原图的每条边有一个割断它的代价,你需要用最小的代价使得这两个点不 ...

  5. [洛谷]P3729 曼哈顿计划EX(最小割树/等价流树)

    题目大意:给出一张n个点m条边的无向图,每个点有点权,q次询问,每次给出k,要求选出若干个点点权之和不小于k,求一个最大的值x,使得选出的点中任意两点之间至少有x条互不相交的链.(n<=550, ...

  6. BZOJ4519[Cqoi2016]不同的最小割——最小割树+map

    题目描述 学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成 两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割.对于带权图来说,将 所有顶点处在 ...

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

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

  8. 最小割树(Gomory-Hu Tree)求无向图最小割详解 附 BZOJ2229,BZOJ4519题解

    最小割树(Gomory-Hu Tree) 前置知识 Gomory-Hu Tree是用来解决无向图最小割的问题的,所以我们需要了解无向图最小割的定义 和有向图类似,无向图上两点(x,y)的割定义为一个边 ...

  9. [学习笔记]最小割树(Gomory-Hu Tree)

    最小割树(\(\mathcal{Gomory-Hu Tree}\))简明指南 对于单源最短路径,我们有\(SPFA\)和\(Dijkstra\),对于多源最短路径,我们有\(Floyd\):对于两点间 ...

  10. 最小割树(Gomory-Hu Tree)

    当我们遇到这样的问题: 给定一个 \(n\) 个点 \(m\) 条边的无向连通图,多次询问两点之间的最小割 我们通常要用到最小割树. 博客 建树 分治.记录当前点集,然后随便找俩点当 \(s\) 和 ...

随机推荐

  1. 苏州Uber优步司机奖励政策(4月18日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. Flutter系列博文链接

    Flutter系列博文链接 ↓: Flutter基础篇: Flutter基础篇(1)-- 跨平台开发框架和工具集锦 Flutter基础篇(2)-- 老司机用一篇博客带你快速熟悉Dart语法 Flutt ...

  3. vbox虚拟机扩容(CentOS 7.2)

    Preface   My virtual machine was simply created by vagrant in default mode without anything about th ...

  4. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  5. Ansible开发之路

    一.初识Ansible 链接:https://www.cnblogs.com/baishuchao/articles/9164083.html 二.Ansible的架构 链接:https://www. ...

  6. Laxcus大数据操作系统2.0(5)- 第二章 数据组织

    第二章 数据组织 在数据的组织结构设计上,Laxcus严格遵循数据和数据描述分离的原则,这个理念与关系数据库完全一致.在此基础上,为了保证大规模数据存取和计算的需要,我们设计了大量新的数据处理技术.同 ...

  7. spring JDBC 事务管理

    spring JDBC 事务管理 一.Spring 中的JDBC Spring中封装了JDBC的ORM框架,可以用它来操作数据,不需要再使用外部的OEM框架(MyBatis),一些小的项目用它. 步骤 ...

  8. 网络安全攻防----html基础

    一.学习html的硬件条件 网页(.Html)是静态的,学习html语言需要选择Chrome浏览器和Sublime3编辑器,选择Chrome浏览器是因为Chrome浏览器兼容性比较好,支持各种各样的插 ...

  9. ViewPort <meta>标记

    ViewPort <meta>标记用于指定用户是否可以缩放Web页面,如果可以,那么缩放到的最大和最小缩放比例是什么.使用ViewPort <meta>标记还表示文档针对移动设 ...

  10. c# 读取blob数据

    Stream stream = new MemoryStream(data); BinaryReader r = new BinaryReader(stream); int iRawImageWidt ...