http://poj.org/problem?id=2987

题意:

公司要由于经济 问题 要 裁员工,已知,要采取某个 员工,那么 他的下属也将被 裁去,给出  裁出 n  个员公的 所获的利益 (可负 可正) ,员工之间的关系 i j,

i  以 j  做为  他的下属  求在获得 最大利益的情况下 ,最少 裁 多少人  。

输出 裁的人数 和 利益  。

题接:  因为 员工 i  以 其上司的 存在 而 存在, 所以 他们 之间 有  依赖关系 , 可应用   最大权闭合图,求解 。

View Code

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<queue>
  9 #include<vector>
 10 #include<string>
 11 #define Min(a,b) a<b?a:b
 12 #define Max(a,b) a>b?a:b
 13 #define CL(a,num) memset(a,num,sizeof(a));
 14 #define maxn  5100
 15 #define eps  1e-6
 16 #define inf  10000000000
 17 #define read() freopen("data.in","r",stdin) ;
 18 #define ll __int64
 19 using namespace std;
 20 ll n , m ;
 21 struct node
 22 {
 23     int from;
 24     int to ;
 25     ll flow ;
 26     int next ;
 27 } p[maxn*20];
 28 int  head[maxn] ,s,t,cnt,dis[maxn];
 29 ll a[maxn]  ,ans,num,sum;
 30 
 31 bool vis[maxn] ;
 32 
 33 queue<int>que ;
 34 void add(int from ,int to , ll flow )
 35 {
 36     p[cnt].to = to ;
 37     p[cnt].flow =flow ;
 38     p[cnt].next = head[from] ;
 39     head[from] = cnt++ ;
 40 
 41     p[cnt].to = from ;
 42     p[cnt].flow = 0 ;
 43     p[cnt].next  = head[to] ;
 44     head[to] = cnt++ ;
 45 
 46 }
 47 
 48 int bfs()
 49 {
 50     CL(dis,-1)  ;
 51     dis[s] =  0 ;
 52     int i ;
 53     while(!que.empty())que.pop() ;
 54 
 55     que.push(s) ;
 56     while(!que.empty())
 57     {
 58         int u = que.front() ;que.pop() ;
 59 
 60         for(i = head[u] ; i != -1  ;i = p[i].next)
 61         {
 62                int v = p[i].to ;
 63 
 64                ll flow  = p[i].flow ;
 65 
 66                if(flow > 0)
 67                if(dis[v] < 0 )
 68                {
 69                    dis[v] = dis[u] + 1 ;
 70                    que.push(v) ;
 71                }
 72 
 73         }
 74 
 75     }
 76 
 77     if(dis[t] > 0) return 1;
 78     else return 0 ;
 79 
 80 
 81 
 82 }
 83 
 84 
 85 ll dfs(int x,ll mx)
 86 {
 87 
 88 
 89     if(x == t) return mx ;
 90 
 91     int i ;
 92     ll a ,tf = 0;
 93 
 94 
 95      for(i = head[x] ; i != -1 ; i = p[i].next)
 96      {
 97          int v = p[i].to ;
 98          ll  flow  = p[i].flow ;
 99          if(flow > 0)
100          {
101               if( dis[v] == dis[x] + 1 && (a = dfs(v,min(flow ,mx))))
102            {
103               p[i].flow -= a ;
104               p[i^1].flow += a;
105 
106             return a ;
107            }
108 
109          }
110 
111      }
112 
113 
114      if(!tf) dis[x] = - 1;
115      return tf ;
116 
117 }
118 void dfs1(int x)
119 {
120 
121 
122     vis[x] = true ;
123     num++;
124 
125     for(int i = head[x] ;i != -1;i = p[i].next)
126     {
127          int v = p[i].to ;
128         if(!vis[v] && p[i].flow > 0)
129             dfs1(v) ;
130     }
131 }
132 void dinic()
133 {
134 
135     ans = 0 ;
136     ll res = 0 ;
137     while(bfs())
138     {
139         while(res = dfs(s,inf))ans += res ;
140     }
141 
142     CL(vis,false) ;
143 
144     num = 0 ;
145     dfs1(s) ;
146 
147     printf("%I64d %I64d\n",num - 1,sum - ans) ;
148 
149 
150 }
151 int main()
152 {
153     int i,x,y ;
154 
155     //read() ;
156     while(scanf("%I64d%I64d",&n,&m)!=EOF)
157     {
158         CL(head,-1) ;
159         cnt =  0 ;
160         sum = 0 ;
161         for(i = 1 ; i <= n;i++)
162         {
163             scanf("%I64d",&a[i]) ;
164             if(a[i] > 0)sum += a[i] ;
165         }
166 
167         for(i = 0 ; i < m;i++)
168         {
169             scanf("%d%d",&x,&y);
170             add(x,y,inf) ;
171         }
172         s = 0 ;
173         t = n + 1 ;
174         for(i = 1 ;i <= n;i++)
175         {
176             if(a[i] >0)
177             {
178                 add(s,i,a[i]);
179             }
180             else
181             {
182                 add(i,t,-a[i]) ;
183             }
184         }
185 
186         dinic() ;
187 
188     }
189 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/11/03/2752347.html

poj 2987 Firing (最大权 闭合 图)相关推荐

  1. POJ - 2987 Firing(最大权闭合图)

    题目链接:点击查看 题目大意:某公司想要裁员,裁员的标准是如果某人被裁,那么其下属也会被裁,依此类推,每一个人都有一个贡献度,问怎样裁员才能使得最后的贡献度最大并且裁掉人数最少 题目分析:最大权闭合图 ...

  2. POJ 2987 Firing 最大权闭合图

    Description You've finally got mad at "the world's most stupid" employees of yours and dec ...

  3. POJ2987 Firing 最大权闭合图

    详情请参考http://www.cnblogs.com/kane0526/archive/2013/04/05/3001557.html 值得注意的地方,割边会把图分成两部分,一部分和起点相连,另一部 ...

  4. POJ 2987 Firing(最大权闭合图)

    [题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...

  5. 【POJ - 2987】Firing(最大权闭合图,网络流最小割,输出方案最小,放大权值法tricks)

    题干: You've finally got mad at "the world's most stupid" employees of yours and decided to ...

  6. 【POJ - 2987 】Firing 【最大权闭合图有唯一的 势 】

    You've finally got mad at "the world's most stupid" employees of yours and decided to do s ...

  7. POJ2987-Firing(最大权闭合图)

    Firing Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 10904   Accepted: 3290 Descript ...

  8. luogu P3410 拍照(最大权闭合图转最小割)

    luogu P3410 拍照 最大权闭合图转最小割 要得到最大收益,我们可以用总可能收益减去最小花费,也就是最小割. #include<cstdio> #include<cstrin ...

  9. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

最新文章

  1. 每天一道LeetCode-----将单词数组分成多行,每行长度相同,单词之间用空格分隔,要求空格尽量均匀分布
  2. zxing android最新下载,Zxing简单集成
  3. 数学--数论--HDU 6128 Inverse of sum (公式推导论)
  4. avue中实现消息的实时展示
  5. 开发了那么多项目,你能自己手写个健壮的链表出来吗?
  6. 协程入门(一):启动与挂起
  7. 《图像语义分析》学习笔记 (一)
  8. ZCANPRO-CAN/CANFD收发软件:安装及使用
  9. 【CCF - 202009-1】称检测点查询 c语言
  10. jeesit的简单使用(四)
  11. 【技术分享】配置手工模式链路聚合(交换机之间直连)
  12. 这四种加薪理由,肯定没戏!
  13. NoteExpress样式制作手册
  14. Python3 猴子第一天摘下若干个桃子,当即吃了一半..
  15. FireFox新标签页打开搜索和书签
  16. 图书云小程序体验版1.0.1发布
  17. j1900适合装哪版群晖_4000-10000元适合家庭使用的台式电脑选购指南(9月)
  18. 熟悉的人不认识我了,不熟悉的人认识我了
  19. 神仙道各种公式【转载】
  20. 微信小程序滑块验证方法

热门文章

  1. java编写大数据分析模型_如何用Java(DOM分析器)编写XML文件
  2. struts2数据库操作_Struts 2操作错误和操作消息
  3. java设计模式工厂模式_Java中的复合设计模式
  4. maps-api-v3_Android Google Maps API集成
  5. python编程示例_Python套接字编程–服务器,客户端示例
  6. Java基础篇:如何使用圆括号
  7. React server rendering —— 网易美学主站同构实录
  8. 日程表、学生课表插件
  9. 洛谷P2770 航空路线问题(费用流)
  10. elixir 高可用系列 - 目录