题意:
     公司要裁员,每个员工被裁掉之后都会有一定的收益(正或者负),有一些员工之间有限制关系,就是裁掉谁之前必须要先裁掉另一个人,问公司的最大收益和最大收益前提下的最小裁员人数?

思路:

      收益有正、有负,员工之间有限制关系,那么是不是瞬间就想到了杭电的那个通讯塔的那么题目,虽然那个是最大点权独立集,而这二个是最大权闭包,但是我感觉两者想法一样,只不过中间是通过一些转换了,这个题有个特别的地方,就是输出最小裁员人数,这个还真不知道怎么弄,然后在网上看了下,说是在残余网络上直接从起点开始搜索,能走到几个就是几,写到是很好写,关键是理解为什么?这个据说论文上有,我说下我的理解,我感觉可能是这样,ss-a-b-tt,如果跑完之后ss-a还有流量会怎样?是不是还有流量就证明挣的钱比花的钱多,那么我们就删除点a,b就行了,把问题复杂化也一样,ss-a-b-tt ss-a-c-tt ,就是说删除a之前要删除b,c才行,如果ss-a还有流量就证明ss-a > (b->tt)+(c->tt)那么删除他们三个是最优的......

#include<queue>
#include<stdio.h>
#include<string.h>#define N_node 5500
#define N_edge 150000
#define INF 0x3f3f3f3f3f3f3f3fusing namespace std;typedef struct
{int to ,next;long long cost;
}STAR;typedef struct
{int x ,t;
}DEP;DEP xin ,tou;
STAR E[N_edge];
int list[N_node] ,listt[N_node] ,tot;
int deep[N_node];void add(int a ,int b ,long long c)
{E[++tot].to = b;E[tot].cost = c;E[tot].next = list[a];list[a] = tot;E[++tot].to = a;E[tot].cost = 0;E[tot].next = list[b];list[b] = tot;
}long long minn(long long x ,long long y)
{return x < y ? x : y;
}bool BFS_Deep(int s ,int t ,int n)
{memset(deep ,255 ,sizeof(deep));xin.x = s ,xin.t = 0;deep[xin.x] = xin.t;queue<DEP>q;q.push(xin);while(!q.empty()){tou = q.front();q.pop();for(int k = list[tou.x] ;k ;k = E[k].next){xin.x = E[k].to;xin.t = tou.t + 1;if(deep[xin.x] != -1 || !E[k].cost)continue;deep[xin.x] = xin.t;q.push(xin);}}for(int i = 0 ;i <= n ;i ++)listt[i] = list[i];return deep[t] != -1;
}long long DFS_Flow(int s ,int t ,long long flow)
{if(s == t) return flow;long long nowflow = 0;for(int k = listt[s] ;k ;k = E[k].next){listt[s] = k;int to = E[k].to;long long c = E[k].cost;if(deep[to] != deep[s] + 1 || !c)continue;long long tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));nowflow += tmp;E[k].cost -= tmp;E[k^1].cost += tmp;if(nowflow == flow) break;}if(!nowflow) deep[s] = 0;return nowflow;
}long long DINIC(int s ,int t ,int n)
{long long Ans = 0;while(BFS_Deep(s ,t ,n)){Ans += DFS_Flow(s ,t ,INF);}return Ans;
}int SS;
int mark[N_node];
void DFS(int s)
{mark[s] = 1;for(int k = list[s] ;k ;k = E[k].next){if(!mark[E[k].to] && E[k].cost){SS ++;DFS(E[k].to);}}return ;
}int main ()
{int n ,m ,i ,a ,b;long long c ,S;while(~scanf("%d %d" ,&n ,&m)){int ss = 0 ,tt = n + 1;memset(list ,0 ,sizeof(list));tot = 1;for(S = 0 ,i = 1 ;i <= n ;i ++){scanf("%lld" ,&c);c > 0 ? add(ss ,i ,c) : add(i ,tt ,-c);if(c > 0) S += c;}for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);add(a ,b ,INF);}S -= DINIC(ss ,tt ,tt);memset(mark ,0 ,sizeof(mark));SS = 0;DFS(ss);printf("%d %lld\n" ,SS ,S);}return 0;
}

poj2987最大权闭包(输出最少建塔个数)相关推荐

  1. hdu4971 流-最大权闭包

    题意:       给了一些任务,然后给了一些完成某些任务的限制,然后又给了限制之间的拓扑关系,最后问你最大收益. 思路:       很直白,就是流的一个应用,最大权闭包,没涉及到什么想法的地方,建 ...

  2. java请实现程序输出以下星塔||输出菱形

    java请实现程序输出以下星塔||输出菱形 请实现程序输出以下星塔. * *** ***** *** * 需要在main函数的输入参数中设置5,输出5层星塔.如果是输入7,则是7层星塔.假设输入参数都 ...

  3. 题目:输入一个8bit数,输出其中1的个数。如果只能使用1bit全加 器,最少需要几个?

    题目:输入一个8bit数,输出其中1的个数.如果只能使用1bit全加器,最少需要几个? 7个1bit全加器 module number_one(input clk,input rst_n,input ...

  4. 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

    /*** 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1.* 输入: coins = ...

  5. 神经网络结构设计指导原则——输入层:神经元个数=feature维度 输出层:神经元个数=分类类别数,默认只用一个隐层 如果用多个隐层,则每个隐层的神经元数目都一样...

    神经网络结构设计指导原则 原文   http://blog.csdn.net/ybdesire/article/details/52821185 下面这个神经网络结构设计指导原则是Andrew NG在 ...

  6. 运用数组,输出从小到大的10个数

    #include<stdio.h> int main() { int a[10]; int i,j,t;  for(i=0;i<10;i++){    //输入10个数,所以i要一直 ...

  7. 编写两个函数分别求两个数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个数由键盘输入。 输入输出格式示例: 输入:24 16 输出:zdgys=8,zxgbs=48

    编写两个函数分别求两个数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个数由键盘输入. 输入输出格式示例: 输入:24 16 输出:zdgys=8,zxgbs=48 #include ...

  8. 输出素数并统计个数 (10分)

    6-24 输出素数并统计个数 (10分) 输入2个正整数m和n(m < n <= 500),输出[m, n]区间内所有的素数,并统计素数的个数.要求实现一个判断素数的简单函数prime§, ...

  9. 322. 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每

    零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 你可以认为每种硬币的数量 ...

最新文章

  1. SEO研究:网站结构
  2. 刚入职,就被各种 Code Review,真的有必要吗?
  3. Gut-口腔微生物可以预测直肠癌
  4. Redis常见面试题及答案模板
  5. html配置ss,#WEB安全基础 : HTML/CSS | 0x8CSS进阶
  6. React中props与state的区别
  7. 基于SharePoint革命性的大型企业协同门户产品
  8. python和noip的区别_【noi与noip的区别】
  9. 在PropertyGrid中使用密码显示
  10. linux安装opencv
  11. 简单的maven自定义webapp目录
  12. 读《怎样解题:数学思维的新方法》有感
  13. MYSQL去重方法汇总
  14. 活水渠 - 云影院之云时代看片全攻略
  15. Elasticsearch-Kibana 8.3.2 集群安装搭建-Linux
  16. 大数据--论文读后感
  17. VMware Workstation 虚拟机不兼容解决方法
  18. windows连接蓝牙失败
  19. 蛋白质二级结构预测Linux,蛋白质稳定性预测工具-Rosetta ddg_monomer
  20. Java 算法 统计单词个数

热门文章

  1. Python startswith() 方法
  2. Hello World -- Java Web版(Java Web 入门教程)
  3. Linux 网络编程详解二(socket创建流程、多进程版)
  4. [ant]通过Android命令自动编译出build.xml文件
  5. 管中窥豹,初探Win RE(Windows恢复环境)
  6. 【转帖】详解CSS网页布局中默认字体样式
  7. 极虎病毒创造四个“之最”
  8. SQL 从一个表读取数据存到另一个表
  9. 从零开始学习jQuery (五) 事件与事件对象【转】
  10. 入门Leaflet之小Demo