poj2125 最小点权覆盖集
题意:有一张图,对于每个点,有出边和入边,现在目的是删除改图的所有边,对于每个点,删除出边的花费Wi-,删除入边的花费Wi+,现在的目的求删去所有边后的花费最小。
建图方法:对于每个点i,拆点为i,i+n,对于入边,从i+n想汇点T连边,值为入边花费;对于出边,从S向i连边,权值为出边花费。m组相连的边(x,y),从x向y+n连边, 费用INF。求出最小割。
然后是计算删除的是哪些点。对于完成最小割后的图,从源点S进行dfs,如果能够访问到,标记。对于不能访问到的点,i<=n时,这个点的出边是属于割集的,即所求点,且为‘-’;如果i>n,表示该点为需要删除的边的点,为'+';
最小割后的图片
(ps:S,T写错了。。。)
根据图很明显的可以看出哪些边时需要删除,并且是哪些点的边。
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 99999999
using namespace std;
const int maxn = *;
const int maxm = ;
struct node
{
int to;
int v;
int flag;
int next;
}edge[(maxn+maxm)*];
struct ans_point
{
int x;
int flag;
}ans_p[maxn];
int index,pre[maxn],vis[maxn],S,T;
int in[maxn],out[maxn];
void add(int x,int y,int z)
{
edge[index].to=y;
edge[index].v=z;
edge[index].flag=index+;
edge[index].next=pre[x];
pre[x]=index++;
edge[index].to=x;
edge[index].v=;
edge[index].flag=index-;
edge[index].next=pre[y];
pre[y]=index++;
}
int dfs(int u,int low)
{
int i,used=;
if(u==T)
return low;
for(i=pre[u];i!=-&&used<low;i=edge[i].next)
{
if(edge[i].v&&vis[edge[i].to]==vis[u]+)
{
int a=dfs(edge[i].to,min(low-used,edge[i].v));
edge[i].v-=a;
edge[edge[i].flag].v+=a;
used+=a;
}
}
if(!used)
vis[u]=-;
return used;
}
bool BFS()
{
int i;
queue<int>q;
memset(vis,-,sizeof(vis));
vis[]=;
q.push();
while(!q.empty())
{
int t=q.front();
q.pop();
for(i=pre[t];i!=-;i=edge[i].next)
{
if(edge[i].v&&vis[edge[i].to]<)
{
vis[edge[i].to]=vis[t]+;
q.push(edge[i].to);
}
}
}
if(vis[T]>)
return true;
return false;
}
void cnt_dfs(int u)
{
int i;
vis[u]=;
for(i=pre[u];i!=-;i=edge[i].next)
{
if(edge[i].v>&&!vis[edge[i].to])
cnt_dfs(edge[i].to);
}
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
index=;
memset(pre,-,sizeof(pre));
S=,T=*n+;
for(i=;i<=n;i++)
{
scanf("%d",&in[i]);
add(i+n,T,in[i]);
}
for(i=;i<=n;i++)
{
scanf("%d",&out[i]);
add(S,i,out[i]);
}
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y+n,INF);
}
int ans=;
while(BFS())
{
int a=dfs(,INF);
if(!a)break;
ans+=a;
}
printf("%d\n",ans);
memset(vis,,sizeof(vis));
cnt_dfs();
int cnt=;
for(i=;i<=n*;i++)
{
if(i>n)
{
if(vis[i])
{
ans_p[cnt].x=i;
ans_p[cnt++].flag=;
}
}
else
{
if(!vis[i])
{
ans_p[cnt].x=i;
ans_p[cnt++].flag=;
}
}
}
printf("%d\n",cnt);
for(i=;i<cnt;i++)
{
if(ans_p[i].x>n)
printf("%d ",ans_p[i].x-n);
else printf("%d ",ans_p[i].x);
if(ans_p[i].flag==)
printf("-\n");
else printf("+\n");
}
}
}
poj2125 最小点权覆盖集的更多相关文章
- POJ2125 Destroying The Graph(二分图最小点权覆盖集)
最小点权覆盖就是,对于有点权的有向图,选出权值和最少的点的集合覆盖所有的边. 解二分图最小点权覆盖集可以用最小割: vs-X-Y-vt这样连边,vs和X部点的连边容量为X部点的权值,Y部和vt连边容量 ...
- POJ2125 Destroying The Graph (最小点权覆盖集)(网络流最小割)
Destroying The Graph Time Limit: 2000MS Memo ...
- POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)
题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- 最小点权覆盖集&最大点权独立集
最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- POJ 2125 最小点权覆盖集(输出方案)
题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有2种操作:去掉进入该点 的所有边,也可以去掉出该点所有边,(第一种代价为w+,第二种代价为w-).求最小代价去除所有边. 己思:点 ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- poj2125最小点权覆盖+找一个割集
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8503 Accepted: 2 ...
随机推荐
- 探索SpringBoot中的SpringMVC
spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc.spring mvc 是只是spring 处理web层请求的一个模块 ...
- Tensorboard在Win7下chrome无论如何无法连接的情况
后记:其实发现原因后感觉自己很蠢,是自己开了一个软件叫adsafe,会屏蔽一些东西,所以我拼命的用自己的电脑ip都连不上,换成回环地址就好了,把软件关了也可以. 在无数种尝试后,终于在stackove ...
- MyBatis框架的文件配置
第一步:log4j.properties的配置 原因:Mybatis的日志输出是依赖与log4j的,所以必须要配置 # Global logging configuration log4j.rootL ...
- LINUX运行级别的原理
在目录 /etc/rc.d/init.d 下有许多服务器脚本程序,一般称为服务(service), 在 /etc/rc.d 下有 7 个名为 rcN.d 的目录,其中 N=0-6,对应于系统的 7 个 ...
- JAVA面试常见问题之Redis篇
Redis为单线程 1.Redis 有哪些数据类型 String 哈希 list set 有序set 2.Redis 内部结构 参考:https://www.cnblogs.com/chenpingz ...
- JavaScript模板引擎实例应用(转)
本文将举实例向大家讲解几个常用模板引擎的简单使用. 演示地址:模板引擎示例http://demo.52fhy.com/jstemp/ 准备工作 演示数据:blog.json结构: { "li ...
- Cors之带凭据的请求
带凭据的请求 默认情况下,跨源请求不提供凭据.通过将withCredentials属性设置为true,可以制定某个请求应该发送凭据.
- Functional Programming Contest - September'14
比赛链接 A题 -- Enter your code here. Read input from STDIN. Print output to STDOUT main = do x <- get ...
- Python缩进和选择
Python缩进和选择 缩进 Python最具特色的是用缩进来标明成块的代码.我下面以if选择结构来举例.if后面跟随条件,如果条件成立,则执行归属于if的一个代码块. 先看C语言的表达方式(注意,这 ...
- SSH 框架controller向jsp传递List jsp中使用el表达式获取
mvc可以使用ModelAndViev传递数据选择跳转的视图 controller中的代码, 把一个模拟的表单studentListSimulate传给ModelAndView @RequestMap ...