[CQOI2016]不同的最小割

该博客探讨了图论中的最小割问题,特别是在无向连通图中寻找所有点对的最小割。通过分析,得出结论图最多有n-1个最小割,因此提出采用分治策略解决。博主分享了分治过程中使用网络流算法并结合染色标记的方法,以降低时间复杂度。同时,还提到了在无向图的网络流中优化技巧,通过两条有向边来代替四条边,提高效率。最后,提供了算法流程,包括选择点、运行最大流、染色以及终止条件等步骤。
摘要由CSDN通过智能技术生成

题目

【问题描述】

  学过图论的同学都知道最小割的概念:对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分是关于s,t的割。对于带权图来说,将所有顶点处在不同部分的边的权值相加所得到的值定义为这个割的容量,而s,t的最小割指的是在关于s,t的割中容量最小的割。

  而对冲刺NOI竞赛的选手而言,求带权图中两点的最小割已经不是什么难事了。我们可以把视野放宽,考虑有N个点的无向连通图中所有点对的最小割的容量,共能得到N(N−1)/2个数值。这些数值中互不相同的有多少个呢?这似乎是个有趣的问题。

【输入格式】

  输入文件第一行包含两个数N,M,表示点数和边数。
  接下来M行,每行三个数u,v,w,表示点u和点v(从1开始标号)之间有条边权值是w。

【输出格式】

  输出文件第一行为一个整数,表示个数。

【输入样例】

4 4
1 2 3
1 3 6
2 4 5
3 4 4

【输出样例】

3

【数据范围】

对于 50% 的数据,N ≤ 200,M ≤ 2000
对于 100% 的数据,1 ≤ N ≤ 850,1 ≤ M ≤ 8500,1 ≤ w ≤ 100000

分析

结论:一张图最多n-1个最小割,所以就是分治啦。

详细证明及更多知识请自行查阅:最小割树

之后就是自然而然的分治了,我们分治只是为了找出所有不同的最小割,因此每一次跑网络流依旧要跑完整张图,但是要用染色来标记当前正在分治的那些点。

最多有n个割,时间复杂度也就是n*网络流算法

技巧

对于无向图的网络流中,可以用两条有向边加,并且最大流量都为cap,就不用连接四条边了,效率大概翻倍。
正确性伪证明:假设从u->v,流量为flow,则反向边为-flow,和反向边流量限制是0还是cap没有关系,反之亦然。

代码

算法流程:
任选两个点,跑一次最大流,然后找出最小割以及对应的ST集合
把S集合全部染成一个新的颜色,然后对S继续操作
同理对T继续操作
最后如果有一个染色的次数相同的话那么就停止。

#include<set>
#include<cmath>
#include<queue>
#include<cctype>
#include<cstdio>
#include<vector>
#include<cstring>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值