POJ2987:Firing——题解
http://poj.org/problem?id=2987
题目大意:
炒掉一个人能够获得b收益(b可以<0),但是炒掉一个人必须得炒掉他的下属(然后继续递归)。
求最大收益和此时最小裁员。
——————————————————————————————
我们需要用到最大权闭合图的知识。
为什么呢?我们把u是v的上司变成u—>v,那么我们要求的就是当前图的最大权闭合图。
那么按照最大权闭合图的知识建立图跑最大流即可。
如何求最大权闭合图:
先在原图中添加s(源点)和t(汇点),原图中的边权全部设为INF,权值为正的点与s连边,权值为点的权值,为负则与t连边,权值为负的点的权值。
答案为原图中权值为正的点的和 - 最小割(最大流)
(以下证明不一定严谨)
然后考虑多少人,我们发现原来减掉的最小割就可以表示成我们没有裁的人的权值,那么没有裁的人必然流满了。
所以我们裁掉的人就是我们最小割没有流满的人,dfs一下即可。
//不开long long见祖宗,十年OI一场空。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
typedef long long ll;
const int INF=;
const int maxn=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int S,T;
struct node{
int nxt;
int to;
ll w;
}edge[*+maxn*+];
int head[maxn],cnt=-;
void add(int u,int v,int w){
cnt++;
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].nxt=head[u];
head[u]=cnt;
return;
}
int lev[maxn],cur[maxn];
bool bfs(int m){
int dui[m],r=;
for(int i=;i<=m;i++){
lev[i]=-;
cur[i]=head[i];
}
dui[]=S,lev[S]=;
int u,v;
for(int l=;l<=r;l++){
u=dui[l];
for(int e=head[u];e!=-;e=edge[e].nxt){
v=edge[e].to;
if(edge[e].w>&&lev[v]==-){
lev[v]=lev[u]+;
r++;
dui[r]=v;
if(v==T)return ;
}
}
}
return ;
}
ll dinic(int u,int flow,int m){
if(u==m)return flow;
ll res=,delta;
for(int &e=cur[u];e!=-;e=edge[e].nxt){
int v=edge[e].to;
if(edge[e].w>&&lev[u]<lev[v]){
delta=dinic(v,min(edge[e].w,flow-res),m);
if(delta>){
edge[e].w-=delta;
edge[e^].w+=delta;
res+=delta;
if(res==flow)break;
}
}
}
if(res!=flow)lev[u]=-;
return res;
}
bool vis[maxn];
int dfs(int u){
int ans=;
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(edge[i].w>&&!vis[v]){
ans+=dfs(v);
}
}
return ans;
}
int main(){
memset(head,-,sizeof(head));
int n=read();
int m=read();
S=n+;T=n+;
ll sum=;
for(int i=;i<=n;i++){
ll b=read();
if(b>){
sum+=b;
add(S,i,b);
add(i,S,);
}else{
add(i,T,-b);
add(T,i,);
}
}
for(int i=;i<=m;i++){
int a=read();
int b=read();
add(a,b,INF);
add(b,a,);
}
ll ans=;
while(bfs(T))ans+=dinic(S,INF,T);
printf("%d %lld\n",dfs(S)-,sum-ans);
return ;
}
POJ2987:Firing——题解的更多相关文章
- POJ2987 Firing 【最大权闭合图】
POJ2987 Firing Description You've finally got mad at "the world's most stupid" employees o ...
- poj2987 Firing 最大权闭合子图 边权有正有负
/** 题目:poj2987 Firing 最大权闭合子图 边权有正有负 链接:http://poj.org/problem?id=2987 题意:由于金融危机,公司要裁员,如果裁了员工x,那么x的下 ...
- poj2987 Firing[最小割]
题目 求选最少点个数的最大权闭合子图.(板子题) 最小割入门题,什么都不想说,丢个别人题解地址就跑. 附加几点个人理解:与s相通的S点集是闭合子图,剩下的与t相通的T点集是其他的.任意一个割都保证了有 ...
- POJ2987 Firing 最大权闭合图
详情请参考http://www.cnblogs.com/kane0526/archive/2013/04/05/3001557.html 值得注意的地方,割边会把图分成两部分,一部分和起点相连,另一部 ...
- poj2987 Firing
以前只是A过很简单的最大闭合权像hdu1565之类,完全的最大流模板题.但是都完全不太懂最大闭合权的定义及其用途. 关于最大流的基础知识,大家可以自己网上搜索关键字.有点基础的哥们妹们,推荐看看胡伯涛 ...
- POJ 2987 - Firing - [最大权闭合子图]
题目链接:http://poj.org/problem?id=2987 Time Limit: 5000MS Memory Limit: 131072K Description You’ve fina ...
- 2019 湖南多校第一场(2018~2019NCPC) 题解
解题过程 开场shl过B,C,然后lfw写J,J WA了以后shl写A,但是因为OJ上空间开小WA了,而不是MLE?,J加了特判过了.之后一直在检查A错哪了,直到qt发现问题改了空间,浪费许多时间,但 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
随机推荐
- Unbuntu安装RVM
apt-get install curl #安装rvm curl -L https://get.rvm.io | bash #执行启动 source /home/mafei/.rvm/scripts/ ...
- MongoDB 安装 增删改查
MongoDB 一 介绍 1.高性能的数据存储解决方案是大多数大型Web应用程序和服务的核心.后端数据库负责存储一切东西,从用户账户的信息到购物车中的商品,以及博客和评论数据等.好的Web应用需要 ...
- HIS 与医保系统的接入方案及实现
HIS 与医保系统的接入方案及实现刘剑锋 李刚荣第三军医大学西南医院信息科(重庆 400038)摘要: 目的 建设HIS,迎接医疗改革的挑战.方法 分析HIS与地方医疗保险系统的不同特点,提出解决问题 ...
- apache Subversion 直接支持LDAP域群组
如果你的Subversion已经用apache的ldap支持用户认证功能,你是否常常在想,既然都用ldap支持认证,为什么不直接支持域群组, 反而在authz文件里面一个一个的手工定义,或者有人用脚本 ...
- 抓取Oracle数据快照
进入到oracle安装目录下的admin(找到这个目录)开启cmd键入sqlplus system/mima@实例名>@awrrpt.sql Would you like an HTML rep ...
- nginx支持php配置
location / { root /wwwroot/phptest; index index.html index.htm index.php; } location ~ \.(php|php5)$ ...
- Qt 报错onecoreuap\inetcore\urlmon\zones\zoneidentifier.cxx(359)\urlmon.dll!00007FF9D9FA5B50:
具体报错内容 onecoreuap\inetcore\urlmon\zones\zoneidentifier.cxx(359)\urlmon.dll!00007FF9D9FA5B50: (caller ...
- 怎样安装Android Studio
在浏览器地址栏输入 http://www.android-studio.org/ 打开Android Studio中文社区, 下载安装包: 这里需要注意的是SDK的目录, 我没有选择默认的目录, 而是 ...
- 移动性能测试之gemebench安装
越来越多的人从事各种移动端性能测试,但工具和文档的资料却相对较少,这两天需要测试一款APP的性能,就来先简单介绍下gamebench的安装吧! 作为国人来说,使用gamebench还是有相当多的坑点: ...
- phpanalysis提取关键字
最近在开发一个文章模块功能,设计那边提出要给文章生成对应标签,用于文章关联推送,这里和大家分享一下实现过程: 这里需要用到PHPAnalysis,下载链接如下 链接:https://pan.baidu ...