POJ 2987 Firing(最大权闭合图)
【题目链接】 http://poj.org/problem?id=2987
【题目大意】
  为了使得公司效率最高,因此需要进行裁员,
      裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果,
      如果裁去一个上级,那么他所管辖的下级需要全部裁掉,问最大效率提升
      同时求出最小裁员
【题解】
  我们从上司向所有的下属连线会发现裁去的部分恰是一个最大权闭合图
      所以按照最大权闭合图建图求最小割,残余网络就是裁员数量。
【代码】
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX_V=5010;
typedef long long LL;
struct edge{int to;LL cap;int rev;};
vector<edge> G[MAX_V];
int V,level[MAX_V],iter[MAX_V];
void add_edge(int from,int to,int cap){
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,0,G[from].size()-1});
}
void bfs(int s){
memset(level,-1,sizeof(level));
queue<int> que;
level[s]=0;
que.push(s);
while(!que.empty()){
int v=que.front(); que.pop();
for(int i=0;i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>0&&level[e.to]<0){
level[e.to]=level[v]+1;
que.push(e.to);
}
}
}
}
LL dfs(int v,int t,LL f){
if(v==t)return f;
for(int &i=iter[v];i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>0&&level[v]<level[e.to]){
LL d=dfs(e.to,t,min(f,e.cap));
if(d>0){
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}return 0;
}
LL max_flow(int s,int t){
LL flow=0;
for(;;){
bfs(s);
if(level[t]<0)return flow;
memset(iter,0,sizeof(iter));
LL f;
while((f=dfs(s,t,INF))>0){
flow+=f;
}
}
}
const int MAX_N=5000;
const int MAX_M=60000;
int N,M,w[MAX_N],a[MAX_M],b[MAX_M];
LL max_weight_closure(int s,int t){
LL W=0; V=t;
for(int i=0;i<=V;i++)G[i].clear();
for(int i=0;i<N;i++){
if(w[i]>0)W+=w[i],add_edge(s,i,w[i]);
if(w[i]<0)add_edge(i,t,-w[i]);
}
for(int i=0;i<M;i++){
add_edge(a[i]-1,b[i]-1,INF);
}
return W-max_flow(s,t);
}
int leftv,vis[MAX_V];
void cal_res_net(int v){
++leftv;
vis[v]=1;
for(int i=0;i<G[v].size();i++){
edge &e=G[v][i];
if(e.cap>0&&!vis[e.to])cal_res_net(e.to);
}
}
void init(){
for(int i=0;i<N;i++)scanf("%d",&w[i]);
for(int i=0;i<M;i++)scanf("%d%d",&a[i],&b[i]);
}
void solve(){
int s=N,t=N+1;
LL max_profit=max_weight_closure(s,t);
memset(vis,0,sizeof(vis));
leftv=0;
cal_res_net(s);
printf("%d %lld\n",--leftv,max_profit);
}
int main(){
while(~scanf("%d%d",&N,&M)){
init();
solve();
}return 0;
}
POJ 2987 Firing(最大权闭合图)的更多相关文章
- poj 2987 Firing  最大权闭合图
		题目链接:http://poj.org/problem?id=2987 You’ve finally got mad at “the world’s most stupid” employees of ... 
- POJ 2987 - Firing - [最大权闭合子图]
		题目链接:http://poj.org/problem?id=2987 Time Limit: 5000MS Memory Limit: 131072K Description You’ve fina ... 
- POJ 2987 Firing  | 最大权闭合团
		一个点带权的图,有一些指向关系,删掉一个点他指向的点也不能留下,问子图最大权值 题解: 这是最大权闭合团问题 闭合团:集合内所有点出边指向的点都在集合内 构图方法 1.S到权值为正的点,容量为权值 2 ... 
- POJ2987 Firing 最大权闭合图
		详情请参考http://www.cnblogs.com/kane0526/archive/2013/04/05/3001557.html 值得注意的地方,割边会把图分成两部分,一部分和起点相连,另一部 ... 
- POJ 2987:Firing(最大权闭合图)
		http://poj.org/problem?id=2987 题意:有公司要裁员,每裁一个人可以得到收益(有正有负),而且如果裁掉的这个人有党羽的话,必须将这个人的所有党羽都裁除,问最少的裁员人数是多 ... 
- POJ 2987 Firing 网络流 最大权闭合图
		http://poj.org/problem?id=2987 https://blog.csdn.net/u014686462/article/details/48533253 给一个闭合图,要求输出 ... 
- POJ 2987 Firing(最大流最小割の最大权闭合图)
		Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ... 
- POJ 2987 Firing【最大权闭合图-最小割】
		题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ... 
- poj 2987(最大权闭合图+割边最少)
		题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ... 
随机推荐
- Android记事本08
			昨天: Anr问题异常的原因和解决方案. 今天: Activity数据传递之通用方式. Activity数据传递之静态变量. Activity数据传递之全局变量. 遇到的问题: 无. 
- 软工实践Alpha冲刺(9/10)
			v队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制 ... 
- RabbitMQ-Java客户端API指南-下
			RabbitMQ-Java客户端API指南-下 使用主机列表 可以将Address数组传递给newConnection().的地址是简单地在一个方便的类com.rabbitmq.client包与主机 ... 
- jmeter的build.xml
			<?xml version="1.0"?><!-- Licensed to the Apache Software Foundation (ASF) unde ... 
- [经验分享]WeTouch中使用VueInputCode
			如果你想在WeTouch中使用以下输入框的效果,需要做以下几个步骤: 第一步:安装Node.js 第二步:使用Npm在全局安装vue-input-code ,使用命令提示符,在Node安装根目录输入以 ... 
- H-1-B签证简介
			H 1-B签证简介 H 1-B签证是美国雇主为外籍高级技术人员申请的一种工作签证,有效期为3年,可在到期后再延长6年.每年新的配额是6.5万人,另外还有2万个名额是留给在美国获得高级学位(硕士以上学位 ... 
- RDM原始设备映射
			在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ... 
- ie8 不支持media
			可以用respond.js库解决,bootstrap文件夹里有.同时需要注意以下几点. 1.需要启动本地服务器(localhost),不能使用普通本地的url地址(file://开头): 2.需要外部 ... 
- 转:Android Context的理解
			转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40481055,本文出自:[张鸿洋的博客] 本文大多数内容翻译自:http://w ... 
- android  hook 框架 ADBI 简介、编译、运行
			Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ... 
