pku2914(求最小割)
来源:互联网 发布:centos 7配置lamp环境 编辑:程序博客网 时间:2024/05/19 02:40
http://162.105.81.212/JudgeOnline/problem?id=2914
题意: 求一无向图的最小割,无源汇点. 500个点, 500 * 499 / 2条边 10s时间.
一个很傻很暴力的做法就是枚举源汇点求最小割,但是复杂度不是一般滴高.
下面是抄袭别人的Stoer-Wagner算法:
核心思想是迭代缩小规模, 算法基于这样一个事实:
对于图中任意两点s和t, 它们要么属于最小割的两个不同集中, 要么属于同一个集.
如果是后者, 那么合并s和t后并不影响最小割. 基于这么个思想, 如果每次能求出图中某两点之间的最小割, 然后更新答案后合并它们再继续求最小割, 就得到最终答案了. 算法步骤如下:
1. 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和.
2. 对刚才选定的s, 更新W(A,p)(该值递增).
3. 选出A外一点p, 且W(A,p)最大的作为新的s, 若A!=G(V), 则继续2.
4. 把最后进入A的两点记为s和t, 用W(A,t)更新cut.
5. 新建顶点u, 边权w(u, v)=w(s, v)+w(t, v), 删除顶点s和t, 以及与它们相连的边.
6. 若|V|!=1则继续1.
看起来很简单, 每次像做最大生成树一样选最大"边"(注意, 这里其实不是边, 而是已经累计的权值之和, 就当是加权的度好了), 然后把最后进入的两个点缩到一块就可以了. 合并点最多有n-1次, 而不加堆优化的prim是O(n^2)的, 所以最终复杂度O(n^3), 要是你有心情敲一大坨代码, 还可以在稀疏图上用Fibonacci Heap优化一下, 不过网上转了一圈, 大多都是说能用Fibonacci Heap优化到怎样怎样的复杂度, 真正能自己写出来的恐怕也没几个, 看看uoregon(俄勒冈大学)的一大坨代码就有点寒. (http://resnet.uoregon.edu/~gurney_j/jmpc/fib.html)
特别注意几个地方, 网上的好几个Stoer-Wagner版本都存在一些小错误:
1. 算法在做"最大生成树"时更新的不是普通意义上的最大边, 而是与之相连的边的权值和, 当所有边都是单位权值时就是累计度.
2. "最后进入A的两点记为s和t", 网上对s有两种解释, 一是在t之前一个加进去的点, 二是t的前趋节点, 也就是最后选择的那条边的另一端. 正解是第一种!
3. 对于稠密图, 比如这题, 我用堆, 映射二分堆, 或者STL的优先队列都会TLE, 还不如老老实实O(n^3).
4. 这题数据中可能存在重边.
5. 注意判断n=0和n=1的情况. 用并查集判下连通性.
- pku2914(求最小割)
- BZOJ_P3345 PKU2914 Minimum Cut(网络流最小割)
- 求全局最小割(SW算法)
- sw算法求最小割学习(*)
- poj 3155 二分+最小割求实型最小割(最大密集子图)
- 求网络的最小割
- HDU 3691 Nubulsa Expo(SW算法求最小割)
- POJ 3469 Dual Core CPU (求最小割)
- HDU 3035 War(对偶图求最小割)
- Dinic 算法求最大流(最小割) POJ 2536
- 求最大网络流(最小割)总结
- hihocoder 1378(有向图求最小割集)
- hdu6214(求最小割最少边数)
- (最小割模板)
- bzoj1412(最小割)
- 日程表(最小割)
- poj3469(最小割)
- 【无向图求最小割集】
- OGRE 学习笔记(启动详解 + 实体的加载与显示)
- 没什么好写的
- 可重入、异步信号安全和线程安全
- SVN版本控制器的安装和配置
- 深入理解JVM
- pku2914(求最小割)
- java发https请求,证书配置
- 海量空间数据库实施策略-栅格数据 2
- 先验概率与后验概率及贝叶斯公式
- VB.net取程序路径经验总结
- 关于QT图标的设置
- ARM9 2410移植之系统启动bootloader 的编写(ADS)
- 结构体内存对齐
- 直线交点的凸包(百度之星2009初赛第二场第三题)