POJ 2987 Firing【最大权闭合图】
题意:给定带点权的有向无环图,求最大权闭合图权值,同时要使得选取的点数最小
分析: 建图:
建立源点 s=0,
在 s 和 正权点之间连一条边权为该点值的边
建立汇点 t=n+1
在 负权点 和 t 之间连一条边权点为该点的绝对值的边
输入的边权值设为INF,求最大流,
求最大流后,在残留网络中从s出发dfs能搜到点都为最大权闭合图中的点,
即这个最小割对应的是最大权闭合图然后让正权点值的累加和减去最大流
就是闭合图的最大权。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define clr(x)memset(x,0,sizeof(x)) #define min(a,b)(a)<(b)?(a):(b) const int INF=0x1f1f1f1f; const int maxn=100005; struct node {int c,next,to; }e[100000000]; int tot; int head[maxn]; void add(int s,int u,int flow) {e[tot].to=u;e[tot].c=flow;e[tot].next=head[s];head[s]=tot++;e[tot].to=s;e[tot].c=0;e[tot].next=head[u];head[u]=tot++; } long long max_flow(int st,int end,int n) {int numh[maxn],h[maxn],curedge[maxn],pre[maxn];int cur_flow,u,tmp,neck,i;long long maxflow=0;clr(h); clr(numh);memset(pre,0xff,sizeof(pre));for(i=0;i<=n;i++)curedge[i]=head[i];numh[0]=n+1;u=st;while(h[st]<n+1){if(u==end){cur_flow=INF;for(i=st;i!=end;i=e[curedge[i]].to)if(cur_flow>e[curedge[i]].c){neck=i;cur_flow=e[curedge[i]].c;}for(i=st;i!=end;i=e[curedge[i]].to){tmp=curedge[i];e[tmp].c-=cur_flow;e[tmp^1].c+=cur_flow;}maxflow+=cur_flow;u=neck;}for(i=curedge[u];i!=-1;i=e[i].next)if(e[i].c&&h[u]==h[e[i].to]+1)break;if(i!=-1){curedge[u]=i;pre[e[i].to]=u;u=e[i].to;}else{if(--numh[h[u]]==0) break;curedge[u]=head[u];for(tmp=n,i=head[u];i!=-1;i=e[i].next)if(e[i].c)tmp=min(tmp,h[e[i].to]);h[u]=tmp+1;++numh[h[u]];if(u!=st)u=pre[u];}}return maxflow; } bool vis[maxn]; void dfs(int u,int t) {int i;if(u==t)return ;vis[u]=true;for(i=head[u];i!=-1;i=e[i].next)if(e[i].c>0&&!vis[e[i].to])dfs(e[i].to,t); } int main() {int a,b,w,i,n,m,res;long long flow;scanf("%d%d",&n,&m);long long sum=0;int s=0,t=n+1;tot=0;memset(head,-1,sizeof(head));for(i=1;i<=n;i++){scanf("%d",&w);if(w>0){sum+=w;add(s,i,w);}else add(i,t,-w);}while(m--){scanf("%d%d",&a,&b);add(a,b,INF);}flow=max_flow(s,t,n+1);clr(vis);dfs(s,t);res=0;for(i=1;i<=n;i++)if(vis[i])res++;printf("%d %lld\n",res,sum-flow);return 0; }
转载于:https://www.cnblogs.com/dream-wind/archive/2012/08/21/2648374.html
POJ 2987 Firing【最大权闭合图】相关推荐
- poj 2987 Firing (最大权 闭合 图)
http://poj.org/problem?id=2987 题意: 公司要由于经济 问题 要 裁员工,已知,要采取某个 员工,那么 他的下属也将被 裁去,给出 裁出 n 个员公的 所获的利益 ( ...
- POJ - 2987 Firing(最大权闭合图)
题目链接:点击查看 题目大意:某公司想要裁员,裁员的标准是如果某人被裁,那么其下属也会被裁,依此类推,每一个人都有一个贡献度,问怎样裁员才能使得最后的贡献度最大并且裁掉人数最少 题目分析:最大权闭合图 ...
- POJ 2987 Firing 最大权闭合图
Description You've finally got mad at "the world's most stupid" employees of yours and dec ...
- 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(最大权闭合图,网络流最小割,输出方案最小,放大权值法tricks)
题干: You've finally got mad at "the world's most stupid" employees of yours and decided to ...
- 【POJ - 2987 】Firing 【最大权闭合图有唯一的 势 】
You've finally got mad at "the world's most stupid" employees of yours and decided to do s ...
- POJ2987-Firing(最大权闭合图)
Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 10904 Accepted: 3290 Descript ...
- luogu P3410 拍照(最大权闭合图转最小割)
luogu P3410 拍照 最大权闭合图转最小割 要得到最大收益,我们可以用总可能收益减去最小花费,也就是最小割. #include<cstdio> #include<cstrin ...
- 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)
整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...
最新文章
- Java项目:新闻发布系统(java+Springboot+ssm+mysql+maven)
- 错过618?暑假阅读季不要错过啦!
- Mysql的体系结构概览
- include 引号和尖括号的区别
- 操作系统源代码_国产操作系统“之光”?Windows XP绝密源代码泄露,BT种子已在网上疯传...
- Java 9:对Process API的增强
- Versant 对象型数据库
- 作者:钱宇华(1976-),男,博士,山西大学计算智能与中文信息处理教育部重点实验室教授...
- 剑指offer——31.栈的压入、弹出序列(想法不错,比剑指的简单)
- AI 落地谁最强?AI Top 30+案例评选等你来秀
- Java中list操作
- 向CentOS6.6服务器安装confluence5.4.4
- select函数的使用
- java五子棋源代码_Java五子棋源码-Java五子棋源代码下载-西西软件下载
- 如何写出优雅的React代码Clean Code vs. Dirty Code
- Unity Shader :实现漫反射与高光反射
- 虎书学习笔记2:图形学基础数学(向量、点积、叉积、)
- Winform中的SaveFileDialog保存文件
- 毗邻华尔街,哥伦比亚大学、纽约大学如何将金融科技的理论与实践结合?
- 由ACD Systems开发的看图工具-ACDSee提供下载