没事干写一发模板。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 510
#define M 1600
#define inf 1000000000
int n,m,p[N],v[N],u[N],tot=0,t=-1;
bool flag[N];
int d[N],cur[N],q[N];
struct data{int to,nxt,cap,flow;
}edge[M<<1];
map<int,bool> f;
namespace tree
{int p[N],fa[N],deep[N],len[N],t=0;struct data{int to,nxt,len;}edge[M<<1];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;}void dfs(int k){for (int i=p[k];i;i=edge[i].nxt)if (edge[i].to!=fa[k]){deep[edge[i].to]=deep[k]+1;fa[edge[i].to]=k;len[edge[i].to]=edge[i].len;dfs(edge[i].to);}}void solve(int q){    while (q--){int x=read(),y=read(),ans=100000000;if (deep[x]<deep[y]) swap(x,y);while (deep[x]>deep[y]) ans=min(ans,len[x]),x=fa[x];while (x!=y) ans=min(ans,len[x]),ans=min(ans,len[y]),x=fa[x],y=fa[y];printf("%d\n",ans);}}
}
void addedge(int x,int y,int z)
{t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=0,p[x]=t;
}
bool bfs(int S,int T)
{memset(d,255,sizeof(d));d[S]=0;int head=0,tail=1;q[1]=S;do{int x=q[++head];for (int i=p[x];~i;i=edge[i].nxt)if (d[edge[i].to]==-1&&edge[i].flow<edge[i].cap){d[edge[i].to]=d[x]+1;q[++tail]=edge[i].to;}}while (head<tail);return ~d[T];
}
int work(int k,int T,int f)
{if (k==T) return f;int used=0;for (int i=cur[k];~i;i=edge[i].nxt)if (d[k]+1==d[edge[i].to]){int w=work(edge[i].to,T,min(f-used,edge[i].cap-edge[i].flow));edge[i].flow+=w,edge[i^1].flow-=w;if (edge[i].flow<edge[i].cap) cur[k]=i;used+=w;if (used==f) return f;}if (used==0) d[k]=-1;return used;
}
void dinic(int S,int T)
{for (int i=0;i<=t;i++) edge[i].flow=0;int ans=0;while (bfs(S,T)){memcpy(cur,p,sizeof(p));ans+=work(S,T,inf);}tree::addedge(S,T,ans);
}
void dfs(int k)
{flag[k]=1;for (int i=p[k];~i;i=edge[i].nxt)if (!flag[edge[i].to]&&edge[i].flow<edge[i].cap)dfs(edge[i].to);
}
void solve(int l,int r)
{if (l>=r) return;dinic(v[l],v[r]);memset(flag,0,sizeof(flag));dfs(v[l]);int cnt=l-1;for (int i=l;i<=r;i++)if (flag[v[i]]) u[++cnt]=v[i];cnt=r+1;for (int i=l;i<=r;i++)if (!flag[v[i]]) u[--cnt]=v[i];for (int i=l;i<=r;i++) v[i]=u[i];solve(l,cnt-1);solve(cnt,r);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("mincuttree.in","r",stdin);freopen("mincuttree.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read();memset(p,255,sizeof(p));for (int i=1;i<=m;i++){int x=read(),y=read(),z=read();addedge(x,y,z),addedge(y,x,z);}for (int i=1;i<=n;i++) v[i]=i;solve(1,n);tree::dfs(1);int q=read();tree::solve(q);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9743341.html

Luogu4897 【模板】最小割树相关推荐

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

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

  2. P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)

    P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...

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

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

  4. P3329-[ZJOI2011]最小割【最小割树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3329 题目大意 nnn个点mmm条边的无向图,每次询问一个xxx表示最小割不超过xxx的点对数量. 解题思路 我 ...

  5. bzoj2229: [Zjoi2011]最小割(最小割树)

    传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了--点数那么少--每次跑出一个最大流就暴力搞一遍就好了 1 //minamoto 2 #in ...

  6. JZOJ 5495 MiniumCut (最小割树)

    MiniumCut Description 从前有张图. 图里 n 个顶点两两之间有 n2n2n^2 种最小割. 告诉你这 n2n2n^2 个最小割. 还原出这张图. Input 第一行一个正整数 n ...

  7. 最小割分治(最小割树):BZOJ2229 BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...

  8. 模板 - 最小割(常见最小割题型技巧总结)

    整理的算法模板合集: ACM模板 目录 一.集合划分模型 二.点边转化 三.最小割的可行边与必须边 四.二分图的可行边和必须边 五.平面图最小割 六.最小割的一些小技巧 1.记录划分方案 2.求割边数 ...

  9. 最小割树:证明与例题

    Definition 对于一张图(有向/无向),都能建立一棵Gomory-Hu Tree,树中节点对应图中节点,树上两点间的最小割等于图中两点间的最小割. Algorithm 1.任取两个点s,t求出 ...

  10. 【LuoguP33294123】[ZJOI2011]最小割[CQOI2016]不同的最小割

    链接1 链接2 题意简述 第一个题 : 问图中有多少不同的最小割数值 第二个题 : \(q\) 次询问图中多少对点对之间的最小割小于 \(x\) . Sol 两个都是模板题就放一起了. 求完最小割树直 ...

最新文章

  1. check_traffic.sh监控格式为Hex-STRING的解决办法
  2. 误删了数据库,我只能跑路么?
  3. UA OPTI512R 傅立叶光学导论 透镜成像系统例题
  4. oracle中触发器的语法,解析Oracle触发器的语法
  5. BugkuCTF-PWN题pwn5-overflow2超详细讲解
  6. 13003.数据类型转换问题(python)
  7. 两个vlan如何互通_网络交换机VLAN的常识与划分方法,你知道吗?
  8. dev项目属性按钮是灰色_【网页特效】11 个文本输入和 6 个按钮操作 特效库
  9. SpringBoot中调用第三方接口的三种方式
  10. ubuntu16.04上阅读CAJ格式的文件
  11. 【多图长文】古希腊式、巴洛克式、哥特式.....图说西方建筑简史
  12. 明星证券化之殇|一点财经
  13. JavaScript throw 语句
  14. Appro DM36x IPNC 4.0 开发环境配置
  15. BUUCTF:[SWPU2019]Network
  16. 融资融券五月试点 首批入选券商或增至5家
  17. Spring @Autowired 用法
  18. EasyCVR实现智慧楼宇道闸控制流程及参考代码分享
  19. Oracle的软件产品是用什么开发出来的
  20. Java 多线程 | 并发知识面试问答总结

热门文章

  1. 拓端tecdat|主题模型(LDA)案例:分析人民网留言板数据
  2. 关于计算机的知识古人,世界仅是一串二进制编码?我们是虚拟的?古人早就给出了答案...
  3. 11、quiver(x,y,u,v)
  4. java swing结束事件_java swing清除事件队列
  5. 基于机器学习的恶意网站/仿冒网站检测实战
  6. java 文件上传 乱码_java中文传值乱码问题的解决方法
  7. 2021-08-19初识JSP
  8. latex 图片整行居中 /centering无效
  9. C++ template<typename> 模板怎么用
  10. Kubernetes 小白学习笔记(22)--kubernetes的运维-管理Namespace