hdu 2987最大权闭合图模板类型题
/*
最大权闭合图模板类型的题,考验对知识概念的理解。 题意:如今要辞退一部分员工。辞退每个员工能够的到一部分利益(能够是负的),而且辞退员工,必须辞退他的下属。求最大利益和辞退的最小人数。 最大权闭合图模板类型。 求出最大权后沿着源点s,dfs到的点就为最小的人数。
证明/*
转载:利用一个经典的trick:多keyword
> 建图前,对全部b[i],运行变换b[i]=b[i]*10000-1。然后。会惊异地发现,
> 此时最大流所相应的方案就是满足辞退最少人数的了。
> 为什么?显然,变换后的流量r2除以10000后再取整就等于原来的流量,可是
> r2的后四位却蕴含了辞退人数的信息:每多辞退一个人,流量就会少1。
>
> 剩下的就是怎样依据一个网络流输出方案。 > 我的做法:从源点開始沿着残余网络dfs(仅仅走没有满载的边),
> 能dfs到的点相应的人就是须要辞退的。*/
*/
#include"stdio.h"
#include"string.h"
#include"string"
#include"queue"
#define ll __int64
#define N 9999
#define inf 0x3fffffff
using namespace std;
struct node {
ll u,v,w,next;
}bian[N*50];
ll fee[N];
ll head[N],yong,s,t,dis[N];
void init(){
yong=0;
memset(head,-1,sizeof(head));
memset(dis,-1,sizeof(dis));
}
void addedge(ll u,ll v,ll w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void add(ll u,ll v,ll w) {
addedge(u,v,w);
addedge(v,u,0);
}
void bfs() {
ll u,v,i;
queue<ll>q;
q.push(t);
dis[t]=0;
while(!q.empty()) {
u=q.front();
q.pop();
for(i=head[u];i!=-1;i=bian[i].next) {
v=bian[i].v;
if(dis[v]==-1) {
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return ;
}
ll ISAP() {
ll sum=0;
bfs();
ll gap[N],cur[N],stac[N],top,i;
memset(gap,0,sizeof(gap));
for(i=s;i<=t;i++) {
gap[dis[i]]++;
cur[i]=head[i];
}
ll k=s;
top=0;
while(dis[s]<t+1) {
if(k==t) {
ll minn=inf,index;
for(i=0;i<top;i++) {
ll e=stac[i];
if(minn>bian[e].w) {
minn=bian[e].w;
index=i;
}
}
for(i=0;i<top;i++) {
ll e=stac[i];
bian[e].w-=minn;
bian[e^1].w+=minn;
}
sum+=minn;
top=index;
k=bian[stac[top]].u;
}
for(i=cur[k];i!=-1;i=bian[i].next) {
ll v=bian[i].v;
if(bian[i].w&&dis[k]==dis[v]+1) {
cur[k]=i;
k=v;
stac[top++]=i;
break;
}
}
if(i==-1) {
ll m=t+1;
for(i=head[k];i!=-1;i=bian[i].next)
if(m>dis[bian[i].v]&&bian[i].w) {
m=dis[bian[i].v];
cur[k]=i;
}
if(--gap[dis[k]]==0)break;
gap[dis[k]=m+1]++;
if(k!=s)
k=bian[stac[--top]].u;
}
}
return sum;
}
ll cou=0,vis[N];
void dfs(ll u){//,ll pre) {会形成环越界
ll i,j;
cou++;
vis[u]=1;
for(i=head[u];i!=-1;i=bian[i].next) {
j=bian[i].v;
if(bian[i].w&&!vis[j]) {
dfs(j);
}
}
return ;
}
int main() {
ll n,m,i,j,sum;
while(scanf("%I64d%I64d",&n,&m)!=EOF) {
init();
s=0;t=n+1;sum=0;
for(i=1;i<=n;i++) {
scanf("%I64d",&fee[i]);
if(fee[i]>0) {
add(s,i,fee[i]);
sum+=fee[i];
}
else
add(i,t,-fee[i]);
}
while(m--) {
scanf("%I64d%I64d",&i,&j);
add(i,j,inf);
}
cou=0;
sum=sum-ISAP();
memset(vis,0,sizeof(vis));
dfs(0);
printf("%I64d %I64d\n",cou-1,sum);
}
return 0;
}
hdu 2987最大权闭合图模板类型题的更多相关文章
- hdu 3879 最大权闭合图(裸题)
/* 裸的最大权闭合图 解:参见胡波涛的<最小割模型在信息学竞赛中的应用 #include<stdio.h> #include<string.h> #include< ...
- hdu 3879 hdu 3917 构造最大权闭合图 俩经典题
hdu3879 base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点 ...
- poj 2987(最大权闭合图+割边最少)
题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ...
- hdu 3061 hdu 3996 最大权闭合图 最后一斩
hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...
- poj 2987 最大权闭合图
Language: Default Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8744 Accept ...
- hdu 3917 (最大权闭合图)
题意:政府有一些路,m个公司来修,每个公司修路要交税给政府,修路政府要付给公司费用,求政府能获得的最大利润,如果选择一个公司负责一个项目,那么该公司负责的其它项目也必须由他负责,并且与其有相连关系的公 ...
- hdu 3996 (最大权闭合图)
题意:有n个区域布局,每个区域有一些金矿,挖开金矿需要一定的费用,可以得到一定的利润,要想挖开一个金矿,必须挖开所有在这个金矿上边的金矿,求最大利益,给的数据价值太大,用64位. 分析:如果一个金矿可 ...
- hdu 3061 (最大权闭合图)
分析:城池之间有依赖关系,汇点与能获得兵力的城池连接,容量为可以获得的兵力,损耗兵力的城池与汇点连接容量为损耗的兵力,有依赖关系的城池间连边,容量为无穷大,跑网络流求出的最小割就是损耗的最小兵力,,, ...
- HDU 3917 最大权闭合图 求最小割
具体参考http://blog.csdn.net/power721/article/details/6665750 TODO //#pragma comment(linker, "/STAC ...
随机推荐
- FFmpeg YUV2RGB
AVFrame* YUV2RGB( AVCodecContext * avctx, AVFrame * frame ) { AVFrame* pFrameRGB=NULL; pFrameRGB=avc ...
- Navicat工具里的empty table和truncate table的区别
如图: 相同点:都会清空数据表里的所有数据 不同点:empty table是清空表里的数据:truncate table是删除表,然后再创建这张表 意义:对于主索引自动增加的情况,empty清表后,新 ...
- JSON劫持漏洞攻防原理及演练
注* 作者发表这篇文章的时间较早,某些方法可能并不是最好的解决方案,但针对这种漏洞进行的攻击还依然可见,如早期的:QQMail邮件泄露漏洞,下面介绍的是对这种攻击原理的介绍. 不久之前,我写了一篇文章 ...
- Android -- 动态添加布局
在做项目的时候,遇到了scrollView与listView结合的使用,导致了滑动的混乱,但是有一个办法可以解决掉这个问题,就是手写listView的高度,还有另外一种方法,传送门:<Andro ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- Ubuntu 16.04 LTS软件包管理基本操作
前文 Ubuntu 16.04 新特性中我们已经介绍过,随着 Ubuntu 16.04 LTS 的发布,Ubuntu 的软件包管理命令也发生了变化,新系统采用了 Debian 项目中所使用的 APT( ...
- org.hibernate.MappingException: An association from the table order_intem_inf refers to a unmapped
执行一个HIbernate的演示样例时出现例如以下错误信息 Exception in thread "main" java.lang.ExceptionInInitializerE ...
- 安全的远程登录(SSH)
Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层) ...
- OpenJudge百炼习题解答(C++)--题4010:2011
题: 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 已知长度最大为200位的正整数n.请求出2011^n的后四位. 输入 第一行为一个正整数k,代表有k组数据,k<=2 ...
- 算法笔记_018:旅行商问题(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 减治法 2.2.1 Johson-Trotter算法 2.2.2 基于字典序的算法 1 问题描述 何为旅行商问题?按照非专业的说法,这个问 ...