poj 2125 有向图破坏,求拆掉图中所有边的最小代价

博客内容讲述了如何解决POJ 2125问题,即如何以最小代价拆掉有向图中的所有边。通过将节点拆分为两部分并构建最小点权覆盖模型,利用最小割方法找到最小代价。在求解方案时,通过搜索从源点s无法到达的节点确定应拆除其出边,而从源点可达的节点则应拆除其入边。
摘要由CSDN通过智能技术生成

对于每个点有两个数in[i],out[i],表示拆掉i的所有入边的代价和拆掉所有出边的代价

对于一条边(u,v)有两种操作可以将其拆掉,要么拆除u的所有出边,要么拆除v的所有入边,两个操作至少要有一个被执行

这就相当于最小点权覆盖(可以参考那篇最小割的论文)中的一条边中的任意一个点都可以覆盖这条边

所以,一个操作看做一个点,一条边相当于连接两个操作的边,一个最小点权覆盖的模型就建立好了

建图过程如下:

新建源点汇点s、t

对于每个点u,拆成u u+n

s->u 容量为out【u】;

u+n->t容量为in[u]

对于每条边u->v

u->v+n,容量为无穷大

求最小割,可得最小代价,(画个简单的图模拟一下就知道为什么这样子是对的啦)

然后是输出方案

直接从s开始搜,(1-n)中不能搜到的点为选择拆除出边操作的点

(n+1-->2*n)中能搜到的点为选择拆除入边操作的点,因为已经求过最小割了,所以这些点(s能搜到的)与t可定已经分开了

注意:最小割对应的是简单割(因为中间的边都有无穷大的容量),哪条边被割了,就相当于选择了对应的某个操作

比如

与源点连接的边是割边,表示拆除a的出边这个操作

与汇点。。。。。。

附一张简单的图

图中拆除a的出边要花费10,拆除b、c的入边都花费4,最小割为8,

所以肯定是选择了b+n->t与c+n->t这两条割边,即选择了拆除b的入边,与拆除c的入边这两个操作

如果两个4变为两个6,则最小割容量为10,选择s->a这条割边,即选择拆除a的出边这个操作

这样子讲,应该比较清楚了吧

View Code
#include<stdio.h>
#include<string.h>
const int MAX=1010;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值