●POJ 2125 Destroying The Graph
题链:
http://poj.org/problem?id=2125
题解:
最小割 + 输出割方案。
建图:
拆点,每个题拆为 i 和 i'分别表示其的入点和出点
建立超源 S和超汇 T。
S -> i :(outi[i]) 割了这个边相当于选择了 i-
i'-> T :(ini[i]) 割了这个边相当于选择了 i+
u -> v':(INF)
然后求Dinic跑最大流求最小割。
至于求方案,首先显然割的边都和 S或 T相连。
从 S开始沿着非满载的边(包括反向边)dfs,对遇到的点打标记。
如果某个入点 i 没有被标记过,则输出 i -
如果某个出点 i'被标记过,则输出 i +
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 500
#define MAXM 150000
#define INF 0x3f3f3f3f
using namespace std;
struct Edge{
int to[MAXM],cap[MAXM],nxt[MAXM],head[MAXN],ent;
void Init(){
ent=2;
memset(head,0,sizeof(head));
}
void Adde(int u,int v,int w){
to[ent]=v; cap[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; cap[ent]=0; nxt[ent]=head[v]; head[v]=ent++;
}
int Next(int i,bool type){
return type?head[i]:nxt[i];
}
}E;
int cur[MAXN],d[MAXN],mark[MAXN];
int N,M,S,T;
int idx(int i,int k){
return i+k*N;
}
bool bfs(){
queue<int>q;
memset(d,0,sizeof(d));
d[S]=1; q.push(S); int u,v;
while(!q.empty()){
u=q.front(); q.pop();
for(int i=E.Next(u,1);i;i=E.Next(i,0)){
v=E.to[i];
if(d[v]||!E.cap[i]) continue;
d[v]=d[u]+1; q.push(v);
}
}
return d[T];
}
int dfs(int u,int reflow){
if(u==T||!reflow) return reflow;
int flowout=0,f,v;
for(int &i=cur[u];i;i=E.Next(i,0)){
v=E.to[i];
if(d[v]!=d[u]+1) continue;
f=dfs(v,min(reflow,E.cap[i]));
flowout+=f; E.cap[i^1]+=f;
reflow-=f; E.cap[i]-=f;
if(!reflow) break;
}
if(!flowout) d[u]=0;
return flowout;
}
int Dinic(){
int flow=0;
while(bfs()){
memcpy(cur,E.head,sizeof(E.head));
flow+=dfs(S,INF);
}
return flow;
}
void DFS(int u){
mark[u]=1;
for(int i=E.Next(u,1);i;i=E.Next(i,0)){
if(!E.cap[i]||mark[E.to[i]]) continue;
DFS(E.to[i]);
}
}
int main()
{
while(~scanf("%d%d",&N,&M)){
memset(mark,0,sizeof(mark));
S=2*N+1; T=2*N+2; E.Init();
for(int i=1,x;i<=N;i++)
scanf("%d",&x),E.Adde(idx(i,1),T,x);
for(int i=1,x;i<=N;i++)
scanf("%d",&x),E.Adde(S,idx(i,0),x);
for(int i=1,u,v;i<=M;i++)
scanf("%d%d",&u,&v),E.Adde(idx(u,0),idx(v,1),INF);
int ans=Dinic(),num=0;
printf("%d\n",ans);
DFS(S);
for(int i=1;i<=N;i++)
num+=((!mark[i])+(mark[i+N]));
printf("%d\n",num);
for(int i=1;i<=N;i++) {
if(!mark[i])printf("%d -\n",i);
if(mark[i+N])printf("%d +\n",i);
}
}
return 0;
}
●POJ 2125 Destroying The Graph的更多相关文章
- poj 2125 Destroying The Graph (最小点权覆盖)
Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS Memory Limit: 65536K ...
- POJ 2125 Destroying the Graph 二分图最小点权覆盖
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8198 Accepted: 2 ...
- 图论(网络流,二分图最小点权覆盖):POJ 2125 Destroying The Graph
Destroying The Graph Description Alice and Bob play the following game. First, Alice draws some di ...
- POJ 2125 Destroying The Graph [最小割 打印方案]
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8311 Accepted: 2 ...
- POJ 2125 Destroying The Graph (二分图最小点权覆盖集+输出最小割方案)
题意 有一个图, 两种操作,一种是删除某点的所有出边,一种是删除某点的所有入边,各个点的不同操作分别有一个花费,现在我们想把这个图的边都删除掉,需要的最小花费是多少. 思路 很明显的二分图最小点权覆盖 ...
- POJ 2125 Destroying The Graph 二分图 最小点权覆盖
POJ2125 题意简述:给定一个有向图,要通过某些操作删除所有的边,每一次操作可以选择任意一个节点删除由其出发的所有边或者通向它的所有边,两个方向有不同的权值.问最小权值和的解决方案,要输出操作. ...
- poj 2125 Destroying The Graph 最小割+方案输出
构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), 连边 (a1,b2),容量为正无穷大 则该 ...
- POJ - 2125 Destroying The Graph (最小点权覆盖)
题意:给一张图,现在要删去所有的边,删去一个点的所有入边和所有出边都有其对应\(W_{i+}\)和\(W_{i-}\).求删去该图的最小花费,并输出解 分析:简而言之就是用最小权值的点集去覆盖所有的边 ...
- 【POJ】【2125】Destroying the Graph
网络流/二分图最小点权覆盖 果然还是应该先看下胡伯涛的论文…… orz proverbs 题意: N个点M条边的有向图,给出如下两种操作.删除点i的所有出边,代价是Ai.删除点j的所有入边,代价是Bj ...
随机推荐
- java关于for循环。
众所周知,JAVA中for循环的基本格式为: for(初始化表达式:布尔表达式:循环后更新表达式){循环体} 举个例子来说可以写成 (1)for (int x=1;x<10;x++){ Syst ...
- [NOI2015]软件包管理器
4621 [NOI2015]软件包管理器 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
- [UWP]针对UWP程序多语言支持的总结,含RTL
UWP 对 Globalization and localization 的支持非常好,可以非常容易地实现应用程序本地化. 所谓本地化,表现最为直观的就是UI上文字和布局方式了,针对文字,提供不同的语 ...
- SpringCloud的服务网关zuul
演示如何使用api网关屏蔽各服务来源 一.概念和定义 1.zuul最终还是使用Ribbon的,顺便测试一下Hystrix断路保护2.zuul也是一个EurekaClient,访问服务注册中心,获取元数 ...
- zabbix配置微信报警
首先我们先目睹下微信报警的效果 接下来我们正式开始操作. 一:注册企业微信. 打开企业微信注册:http://work.weixin.qq.com 根据以上提示填入相应的内容,然后注册即可. 二:登录 ...
- 微信小程序授权获取用户详细信息openid
小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...
- python中两种方法实现二分法查找,细致分析二分法查找算法
之前分析了好多排序算法,可难理解了呢!!(泣不成声)这次我要把二分查找总结一下,这个算法不算难度特别大,欢迎大家参考借鉴我不喜欢太官方的定义,太晦涩的语言,让人看了就头晕.我希望加入我自己的理解,能帮 ...
- Web微信
一.源代码地址: https://github.com/HuangAm/Webweixin 二.总结: 1.分析Http请求 - 请求方式:get.post等等 - URL:每个请求的url,固定部分 ...
- Asp.Net Core 2.0 项目实战(8)Core下缓存操作、序列化操作、JSON操作等Helper集合类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- Java-Maven(八):IDEA使用本地maven,并配置远程中央仓库
声明:已经安装了maven,安装请参考:<Java-Maven(一):Maven的简介与安装> 1)一般我们从github.码云(https://gitee.com)上获取代码后,实际上我 ...