Destroying The Graph(poj 2125)
题意:
给你一张有向图,你可以选择一个点:
• 摧毁其所有的入边,代价A[i].
• 摧毁其所有的出边,代价B[i].
• 求摧毁这张图的最小代价。
• 数据范围1000
/*
很经典的一道题目(我这么弱,稍微一变形就不会了)
因为每个点涉及到出边和入边,所以可以考虑拆点,然后建图,接下来就成了一个最小点权覆盖的问题。
最小点权覆盖就是求最小割(证明可参考胡伯涛论文“最小割模型在信息学竞赛中的应用”)。
接下来是输出方案,因为我们要选择的点与S或T连得边是满流的,所以可以dfs一边,只走不满流的,
那么如果一个<=n的点走不到,说明它被选择了(这个很好理解),如果一个>n的点能走到,说明它被选择了,
这是因为如果这个点没有被选择,说明从前面水流流过来的时候到某个位置已经割断了,在这里就没必要再割了。
(貌似好难理解的样子,我这么弱肯定想不出来)。
*/
#include<cstdio>
#include<iostream>
#define N 210
#define M 5010
#define inf 1000000000
using namespace std;
int a[N],b[N],head[N],dis[N],q[N],vis[N],n,m,cnt=,S,T;
struct node{
int v,f,pre;
};node e[M*];
void add(int u,int v,int f){
e[++cnt].v=v;e[cnt].f=f;e[cnt].pre=head[u];head[u]=cnt;
e[++cnt].v=u;e[cnt].f=;e[cnt].pre=head[v];head[v]=cnt;
}
bool bfs(){
for(int i=;i<=T;i++)dis[i]=inf;
int h=,t=;q[]=S;dis[S]=;
while(h<t){
int u=q[++h];
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
if(e[i].f&&dis[u]+<dis[v]){
dis[v]=dis[u]+;
if(v==T)return true;
q[++t]=v;
}
}
}
if(dis[T]==inf)return false;
return true;
}
int dinic(int now,int f){
if(now==T)return f;
int rest=f;
for(int i=head[now];i;i=e[i].pre){
int v=e[i].v;
if(e[i].f&&dis[v]==dis[now]+){
int t=dinic(v,min(rest,e[i].f));
if(!t)dis[v]=;
e[i].f-=t;
e[i^].f+=t;
rest-=t;
}
}
return f-rest;
}
void dfs(int x){
vis[x]=;
for(int i=head[x];i;i=e[i].pre){
if(!e[i].f||vis[e[i].v])continue;
dfs(e[i].v);
}
}
int main(){
scanf("%d%d",&n,&m);
S=,T=*n+;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
add(i+n,T,a[i]);
}
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
add(S,i,b[i]);
}
for(int i=;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
add(x,y+n,inf);
}
int min_cnt=,p=,pin=,pout=;
while(bfs()) min_cnt+=dinic(S,inf);
printf("%d\n",min_cnt);
dfs(S);
for(int i=;i<=n;i++){
if(!vis[i])p++;
if(vis[i+n])p++;
}
printf("%d\n",p);
for(int i=;i<=n;i++){
if(!vis[i])printf("%d -\n",i);
if(vis[i+n])printf("%d +\n",i);
}
return ;
}
Destroying The Graph(poj 2125)的更多相关文章
- poj 2125 Destroying The Graph (最小点权覆盖)
Destroying The Graph http://poj.org/problem?id=2125 Time Limit: 2000MS Memory Limit: 65536K ...
- 01背包问题:Charm Bracelet (POJ 3624)(外加一个常数的优化)
Charm Bracelet POJ 3624 就是一道典型的01背包问题: #include<iostream> #include<stdio.h> #include& ...
- Scout YYF I(POJ 3744)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5565 Accepted: 1553 Descr ...
- 2017ACM暑期多校联合训练 - Team 5 1006 HDU 5205 Rikka with Graph (找规律)
题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...
- HDU 4467 Graph(图论+暴力)(2012 Asia Chengdu Regional Contest)
Description P. T. Tigris is a student currently studying graph theory. One day, when he was studying ...
- 广大暑假训练1(poj 2488) A Knight's Journey 解题报告
题目链接:http://vjudge.net/contest/view.action?cid=51369#problem/A (A - Children of the Candy Corn) ht ...
- Games:取石子游戏(POJ 1067)
取石子游戏 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37662 Accepted: 12594 Descripti ...
- BFS 或 同余模定理(poj 1426)
题目:Find The Multiple 题意:求给出的数的倍数,该倍数是只由 1与 0构成的10进制数. 思路:nonzero multiple 非零倍数 啊. 英语弱到爆炸,理解不了题意... ...
- 并查集+关系的传递(poj 1182)
题目:食物链 题意:给定一些关系.判断关系的正确性,后给出的关系服从之前的关系: 思路:难点不在并查集,在于关系的判断,尤其是子节点与根节点的关系的判断: 这个关系看似没给出,但是给出子节点与父节点的 ...
随机推荐
- linux基本命令
常用命令: w 查看登入用户(第一行为主机负载) ifconfig -a 查看所有网络 dhclient 自动获取IP地址 关机命令 init0 shutdown -h now 重启命令 init 6 ...
- SpringBoot IntelliJ创建简单的Restful接口
使用SpringBoot快速建服务,和NodeJS使用express几乎一模一样,主要分为以下: 1.添加和安装依赖 2.添加路由(即接口) 3.对路由事件进行处理 同样坑的地方就是,祖国的防火墙太 ...
- 使用Zabbix官方模板监控Redis运行状况
运行环境: OS:CentOS 6.8 / Python: 2.6.6 / Pip: 7.1.0 / Redis:3.0 / Zabbix:3.0.3 Zabbix官方提供的监控模板. 项目地址:ht ...
- win7搭建双系统ubuntu
参考链接:http://www.linuxidc.com/Linux/2014-10/108430.htm 0.下载EasyBCD软件和ubuntu镜像1.在win7,右键我的电脑,磁盘管理,压缩卷, ...
- BZOJ1013: [JSOI2008]球形空间产生器sphere
传送门 高斯消元练习. 模板: void Guass(){ int waited; up(i,1,N){ waited=i; up(j,i+1,N)if(fabs(M[j][i])>fabs(M ...
- Hibernate(Control)
案例:http://blog.csdn.net/jiuqiyuliang/article/details/39380465 对象关系映射框架,它对JDBC进行了轻量级的对象封装,可以使用对象编程思维来 ...
- GetViewUrl
<f:TemplateField HeaderText="名称" ColumnID="Name" ExpandUnusedSpace="true ...
- [原创] Delphi小工具(Windows资源管理器右键菜单扩展)
两个小工具 1. 项目临时文件清理 2. Android Ndk 编译 c/c++ jni 源码工具. 下载后,点击Reg.bat就可以完成注册安装.不需要时点击 UnReg.Bat 就可以删除菜单. ...
- 室内定位系列(二)——仿真获取RSS数据
很多情况下大家都采用实际测量的数据进行定位算法的性能分析和验证,但是实际测量的工作量太大.数据不全面.灵活性较小,采用仿真的方法获取RSS数据是另一种可供选择的方式.本文介绍射线跟踪技术的基本原理,以 ...
- CAS环境搭建
实验背景: 系统环境: Windows XP | SUN JDK1.6U4 | Tomcat6.0.14 | CAS Server 3.1.1 + CAS Client 2.1.1 主机完整名称: ...