首页 > 其他分享 >最小割树 学习笔记

最小割树 学习笔记

时间:2023-08-05 17:56:21浏览次数:33  
标签:割树 int text flow 最小 笔记 now es

最小割树(Gomory-Hu Tree)是一种可以在 \(O(Vf)\) 的时间里求出一个图中全源最小割的算法,其中 \(f\) 为一次最大流的时间。

记原图为 \(G=(V,E)\),其最小割树为 \(G'=(V,E')\).

在最小割树中,任两点间的最小割等于它们在原图中的最小割,且 \(\forall (u, v) \in E'\),\(E' \setminus \{u, v\}\) 将 \(V\) 分割成的两个集合等于 \(u,v\) 最小割将 \(V\) 分割成的两个集合。

算法流程:在当前点集 \(V_\text{now}\) 中选两个点 \(u,v\),求出它们在 \(G\) 中的最小割,在 \(G'\) 中将 \(u, v\) 连边,权为割的值。同时,求出最小割将 \(V_\text{now}\) 分成的两个集合,将它们作为新一轮的 \(V_\text{now}\) 递归求解,这两个集合中的点在 \(G'\) 中以 \((u,v)\) 连接。

边界条件:\(\left\vert V_{\text{now}} \right\vert = 1\),此时直接返回。

感性证明:当某一步把 \(u,v\) 划分到两个 \(V_{\text{now}}\) 中时,\(u,v\) 的最小割 \(\le\) 此时的最小割。

总共要跑 \(V-1\) 次最大流,因此时间复杂度是 \(O(Vf)\) 的。

code:

auto &ans(int x, int y){ return x>y ? ans_[y][x] : ans_[x][y]; }
int vis[N];
void dfs(int x){
	for(int i=flow::head[x+1]; i; i=flow::es[i].nxt){
		if(flow::es[i].lf > 0 && !vis[flow::es[i].to-1]){
			vis[flow::es[i].to-1] = 1;
			dfs(flow::es[i].to-1);
		}
	}
}
void gomory_hu(int *l, int *r){
	if(l == r-1) return;
	flow::reset();
	flow::maxflow(*l, *(r-1));
	ans(*l, *(r-1)) = flow::maxf;
	std::fill(vis, vis+in, 0);
	dfs(*l);
	int *lp = l+1, *rp = r-2;
	while(lp <= rp){
		if(vis[*lp]) lp++;
		else std::swap(*lp, *rp), rp--;
	}
	gomory_hu(l, lp);
	gomory_hu(lp, r);
	UP(i, l, lp) UP(j, lp, r){
		ans(*i, *j) = std::min({
				ans(*i, *l), ans(*l, *(r-1)), ans(*j, *(r-1))
				});
	}
}

标签:割树,int,text,flow,最小,笔记,now,es
From: https://www.cnblogs.com/x383494/p/17608317.html

相关文章

  • k8s 学习笔记之 Service——Service 介绍和类型
    Service介绍在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚......
  • k8s 学习笔记之 Pod 控制器——StatefulSet
    StatefulSetStatefulSet是用来管理有状态应用的工作负载API对象。StatefulSet用来管理某Pod集合的部署和扩缩,并为这些Pod提供持久存储和持久标识符。和Deployment类似,StatefulSet管理基于相同容器规约的一组Pod。但和Deployment不同的是,StatefulSet为它们的每个......
  • 最小生成树/二分图
    最小生成树Prim算法朴素版PrimO(n^2)稠密图步骤:S:表示最小生成树的集合初始化距离找距离集合S最近的节点将节点加入集合S用该节点更新非S点到集合S点的距离代码:constintN=510;constintINF=0x3f3f3f3f;intg[N][N];intd[N];//非生成树节点与生成树......
  • 笔记本电脑小键盘数字键的光标作用
    我的笔记本平时要使用home,end功能时,由于键位太小不好找,且要结合fn+键位的按法,非常麻烦如图通过NumLock切换小键盘数字键实现光标功能......
  • HTTP学习笔记
    HTTP:超文本传输协议(HTTP)是用于传输超媒体文档(例如HTML)的应用层协议,是为Web浏览器之间的通信而设计,也可用于其他目的,是无状态协议,这意味着服务器不会在两个请求之间保留任何数据,HTTP遵循经典的客户端-服务端模型HTTP概述:HTTP是用于获取诸如HTML文档这类资源的协议,是Web......
  • k8s 学习笔记之 Pod 控制器——DaemonSet(DS)
    DaemonSet(DS)DaemonSet类型的控制器可以保证在集群中的每一台(或指定)节点上都运行一个副本。一般适用于日志收集、节点监控等场景。也就是说,如果一个Pod提供的功能是节点级别的(每个节点都需要且只需要一个),那么这类Pod就适合使用DaemonSet类型的控制器创建。DaemonSet控......
  • k8s 学习笔记之 Pod 控制器——Job & CronJob
    JobJob,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务。Job特点如下:当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量当成功结束的pod达到指定的数量时,Job将完成执行Job的资源清单文件:apiVersion:batch/v1#版本号k......
  • SQL-去除最大值与最小值求均值的问题
    背景今天有同事问我一道关于数据库SQL的面试题,我刚开始随便给了一个思路,后来思索发现这个思路有漏洞,于是总结下来,仅供参考。问题:薪水表中是员工薪水的基本信息,包括雇员编号,和薪水,查询除去最高、最低薪水后的平均薪水。一、薪水表信息CREATETABLE`salaries`(`emp_n......
  • k8s 学习笔记之 Pod 控制器——Horizontal Pod Autoscaler(HPA)
    在之前的学习中,我们已经可以实现通过手工执行kubectlscale命令实现Pod扩容或缩容,但是这显然不符合Kubernetes的定位目标——自动化、智能化。Kubernetes期望可以实现通过监测Pod的使用情况,实现pod数量的自动调整,于是就产生了HorizontalPodAutoscaler(HPA)这种控制器。......
  • k8s 学习笔记之 Pod 控制器——Deployment
    Deployment(Deploy)为了更好的解决服务编排的问题,kubernetes在V1.2版本开始,引入了Deployment控制器。值得一提的是,这种控制器并不直接管理pod,而是通过管理ReplicaSet来简介管理Pod,即:Deployment管理ReplicaSet,ReplicaSet管理Pod。所以Deployment比ReplicaSet功能......