正题

题目链接:https://www.luogu.com.cn/problem/P3329


题目大意

nnn个点mmm条边的无向图,每次询问一个xxx表示最小割不超过xxx的点对数量。


解题思路

我们对于两个点sss到ttt完成网络流后的残量网络上,与sss联通的点属于点集SSS,与ttt联通的属于点集TTT。那么S−>TS->TS−>T的任意点对最小割都为s−>ts->ts−>t的最小割。

我们根据这个性质来建立最小割树,每次让sss与ttt连接一条边权为www的边然后递归下去分开处理SSS和TTT。

这样满足两点之间的最小割就是他们最小割树路径上的最小边权。

然后排序加并查集处理询问即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=210,inf=1e18;
struct edge{ll x,y,w;
}e[N],q[N];
ll n,m,T,tot,fa[N],siz[N],ans[N],p[N],dep[N];
namespace net{struct node{ll to,next,w,ret;}a[3100*4];ll tot,s,t,ls[N];queue<int> q;void init(){memset(ls,0,sizeof(ls));tot=1;return;}void addl(ll x,ll y,ll w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=a[tot].ret=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=a[tot].ret=w;return;}bool bfs(){memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty())q.pop();q.push(s);while(!q.empty()){ll x=q.front();q.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;}ll dinic(ll x,ll flow){if(x==t)return flow;ll rest=0,k;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(a[i].to,min(flow-rest,a[i].w)));a[i].w-=k;a[i^1].w+=k;if(rest==flow)return flow;}if(!rest)dep[x]=0;return rest;}ll solve(ll S,ll T){s=S;t=T;ll ans=0;while(bfs())ans+=dinic(s,inf);return ans;}void rcy(){for(ll i=2;i<=tot;i++)a[i].w=a[i].ret;}
}
void addl(ll x,ll y,ll w)
{e[++tot].x=x;e[tot].y=y;e[tot].w=w;return;}
bool cmp(ll x,ll y)
{return dep[x]<dep[y];}
bool cMp(edge x,edge y)
{return x.w>y.w;}
void solve(ll l,ll r){if(l==r)return;net::rcy();ll w=net::solve(p[l],p[r]);addl(p[l],p[r],w);sort(p+l,p+r+1,cmp);ll mid;for(ll i=l;i<=r;i++)if(dep[p[i]]){mid=i;break;}solve(l,mid-1);solve(mid,r);return;
}
ll find(ll x)
{return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
int main()
{scanf("%lld",&T);while(T--){scanf("%lld%lld",&n,&m);net::init();tot=0;for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);net::addl(x,y,w);}for(ll i=1;i<=n;i++)p[i]=fa[i]=i,siz[i]=1;solve(1,n);sort(e+1,e+1+tot,cMp);scanf("%lld",&m);for(ll i=1;i<=m;i++){scanf("%lld",&q[i].w);q[i].x=i;}sort(q+1,q+1+m,cMp);ll l=1,sum=0;for(ll i=1;i<=m;i++){while(l<=tot&&e[l].w>q[i].w){ll x=e[l].x,y=e[l].y;x=find(x);y=find(y);fa[y]=x;sum+=siz[x]*siz[y];siz[x]+=siz[y];l++;}ans[q[i].x]=n*(n-1)/2-sum;}for(ll i=1;i<=m;i++)printf("%lld\n",ans[i]);putchar('\n');}
}

P3329-[ZJOI2011]最小割【最小割树】相关推荐

  1. 【每日算法】【图论】【最小边覆盖 最小路径覆盖 最小顶点覆盖 最大独立集 最大团】

    最小边覆盖 = 最大独立集 = |V| - 最大匹配数 这个是在原图是二分图上进行的 最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是N x N的有向图,不能有环,然后根据原图构造二分图 ...

  2. 最小风险 最小错误 贝叶斯决策 Bayes(实例详解)

    文章目录 简介 最小错误率Bayes 例子 分析 最小风险的Bayes决策 最小风险Bayes决策规则: 例子 简介 贝叶斯决策其实是已经被很多博客解释的非常详细了,为了不制造学术垃圾,本来一直没打算 ...

  3. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

  4. Ural 1277 Cops and Thieves(最小点割集/最小割)

    题意:一个团伙去偷一个美术馆,警察决定在路上堵截.警察人数为k,不能在贼窝和美术馆驻扎,只能在图上其他点驻扎,而且驻扎有一个最小人数要求,问警察能否完成任务. 解法:又是最小点割集题目,每个点拆点即可 ...

  5. 【csust】最小素因子问题(树状数组)

    题干: http://csustacm.com:4803/problem/1083 Description 寒冰射手艾希新学会了一个技能,艾希通过这个技能成为了一名声名远扬的神箭手,从此再也无人敢侵犯 ...

  6. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  7. 推导B树的最大高度和最小高度得出B树的高度范围

    前提条件:n>=1,则对于任意一棵包含n个关键字.高度为h.阶数为m的B树. 一.最小高度: 对于任意树类型的数据结构,如果其每层节点能够分布的足够满,其高度也会随之变得足够的低.基于这个思路, ...

  8. 比例割归一化割的拉普拉斯算子是怎么来的,有什么意义?

    这个问题的来由参见<社区发现之谱聚类算法手撕举例> 例:下图中7个点被分到了3个社区 邻接矩阵 A=[0100000101000001010000010100000101000001010 ...

  9. 打开计算机后 无法最小化,最小化窗口后无法在任务栏中显示的三种解决方法...

    [文章导读]最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下点击程序的最小化按钮都会显示在任务栏中,方便我们点击再次打开. 最近有用户反映打开的窗口最小化后无法在任务栏中显示,通常情况下 ...

  10. 桌面计算机最小化,最小化我的电脑窗口打开总是最小化,如何把它 – 手机爱问...

    2018-03-29 窗口最大化我的浏览器点击打开后,弹出的窗口总是最小化,该怎样解决? 最主要的是如何保持后面新弹出的窗口都是最大化的. 1.把所有的IE窗口关了;只打开一个IE窗口;最大化这个窗口 ...

最新文章

  1. CentOS之——CentOS7安装iptables防火墙
  2. TC260-001《汽车采集数据处理安全指南》
  3. 根证书和中间证书的区别
  4. GridView的Command命令集合
  5. 【LeetCode从零单排】No 191.Number of 1 Bits(考察位运算)
  6. 黄仁勋评价股东孙正义
  7. 小蚂蚁学习C语言(25)——C语言结构体——使用结构体手动录入信息的小案例...
  8. Java通过Executors提供四种线程池
  9. “630”落幕 光伏何去何从?
  10. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发
  11. mysql event查询_Mysql中Event的一些测试
  12. 分子动力学理论部分总结(未整理完)
  13. The Backrooms - Level 0.2 - 我爱杏仁水
  14. 工作一年时期的土豆总结——复杂度和困难度
  15. 空间数据挖掘与空间大数据的探索与思考(三)
  16. Win32汇编:数组与标志位测试总结
  17. XOI2003赛后题解
  18. Qt: QStringList去除重复元素
  19. python爬虫--scrapy框架的学习和使用(七)⭐---第二部分
  20. 四平博达学院计算机社团,民盟四平市委博达学院支部举行换届会议

热门文章

  1. vue路由上的#/怎么去掉_如何去掉vue路由中的#
  2. php正则获取标签,PHP通过正则匹配中文字符 过滤html标签 获取文本内容
  3. 初级Java开发面试必问项!!! 标识符、字面值、变量、数据类型,该学学了!
  4. java中week of year_Java WeekFields weekOfYear()用法及代码示例
  5. java io流 教程_Java基础教程:IO流与文件基础
  6. java buffalo_随你怎么玩!Buffalo 网络硬盘新潮流
  7. android dialog 自定义布局,如何设置AlertDialog的自定义布局?
  8. PTA 7-3 地铁一日游 (30 分)
  9. 计算机专业可以报考放射医学吗吗,文科生可以报考医学影像技术专业吗
  10. [JavaWeb-HTML]HTML标签_语义化标签