1. /*
  2. 最大权闭合图模板类型的题,考验对知识概念的理解。
  3.  
  4. 题意:如今要辞退一部分员工。辞退每个员工能够的到一部分利益(能够是负的),而且辞退员工,必须辞退他的下属。求最大利益和辞退的最小人数。
  5.  
  6. 最大权闭合图模板类型。
  7.  
  8. 求出最大权后沿着源点s,dfs到的点就为最小的人数。
  9. 证明/*
  10. 转载:利用一个经典的trick:多keyword
  11. > 建图前,对全部b[i],运行变换b[i]=b[i]*10000-1。然后。会惊异地发现,
  12. > 此时最大流所相应的方案就是满足辞退最少人数的了。
  13. > 为什么?显然,变换后的流量r2除以10000后再取整就等于原来的流量,可是
  14. > r2的后四位却蕴含了辞退人数的信息:每多辞退一个人,流量就会少1。
  15. >
  16. > 剩下的就是怎样依据一个网络流输出方案。
  17.  
  18. > 我的做法:从源点開始沿着残余网络dfs(仅仅走没有满载的边),
  19. > 能dfs到的点相应的人就是须要辞退的。*/
  20. */
  21. #include"stdio.h"
  22. #include"string.h"
  23. #include"string"
  24. #include"queue"
  25. #define ll __int64
  26. #define N 9999
  27. #define inf 0x3fffffff
  28. using namespace std;
  29. struct node {
  30. ll u,v,w,next;
  31. }bian[N*50];
  32. ll fee[N];
  33. ll head[N],yong,s,t,dis[N];
  34. void init(){
  35. yong=0;
  36. memset(head,-1,sizeof(head));
  37. memset(dis,-1,sizeof(dis));
  38. }
  39. void addedge(ll u,ll v,ll w) {
  40. bian[yong].u=u;
  41. bian[yong].v=v;
  42. bian[yong].w=w;
  43. bian[yong].next=head[u];
  44. head[u]=yong++;
  45. }
  46. void add(ll u,ll v,ll w) {
  47. addedge(u,v,w);
  48. addedge(v,u,0);
  49. }
  50. void bfs() {
  51. ll u,v,i;
  52. queue<ll>q;
  53. q.push(t);
  54. dis[t]=0;
  55. while(!q.empty()) {
  56. u=q.front();
  57. q.pop();
  58. for(i=head[u];i!=-1;i=bian[i].next) {
  59. v=bian[i].v;
  60. if(dis[v]==-1) {
  61. dis[v]=dis[u]+1;
  62. q.push(v);
  63. }
  64. }
  65. }
  66. return ;
  67. }
  68. ll ISAP() {
  69. ll sum=0;
  70. bfs();
  71. ll gap[N],cur[N],stac[N],top,i;
  72. memset(gap,0,sizeof(gap));
  73. for(i=s;i<=t;i++) {
  74. gap[dis[i]]++;
  75. cur[i]=head[i];
  76. }
  77. ll k=s;
  78. top=0;
  79. while(dis[s]<t+1) {
  80. if(k==t) {
  81. ll minn=inf,index;
  82. for(i=0;i<top;i++) {
  83. ll e=stac[i];
  84. if(minn>bian[e].w) {
  85. minn=bian[e].w;
  86. index=i;
  87. }
  88. }
  89. for(i=0;i<top;i++) {
  90. ll e=stac[i];
  91. bian[e].w-=minn;
  92. bian[e^1].w+=minn;
  93. }
  94. sum+=minn;
  95. top=index;
  96. k=bian[stac[top]].u;
  97. }
  98. for(i=cur[k];i!=-1;i=bian[i].next) {
  99. ll v=bian[i].v;
  100. if(bian[i].w&&dis[k]==dis[v]+1) {
  101. cur[k]=i;
  102. k=v;
  103. stac[top++]=i;
  104. break;
  105. }
  106. }
  107. if(i==-1) {
  108. ll m=t+1;
  109. for(i=head[k];i!=-1;i=bian[i].next)
  110. if(m>dis[bian[i].v]&&bian[i].w) {
  111. m=dis[bian[i].v];
  112. cur[k]=i;
  113. }
  114. if(--gap[dis[k]]==0)break;
  115. gap[dis[k]=m+1]++;
  116. if(k!=s)
  117. k=bian[stac[--top]].u;
  118. }
  119. }
  120. return sum;
  121. }
  122. ll cou=0,vis[N];
  123. void dfs(ll u){//,ll pre) {会形成环越界
  124. ll i,j;
  125. cou++;
  126. vis[u]=1;
  127. for(i=head[u];i!=-1;i=bian[i].next) {
  128. j=bian[i].v;
  129. if(bian[i].w&&!vis[j]) {
  130. dfs(j);
  131. }
  132. }
  133. return ;
  134. }
  135. int main() {
  136. ll n,m,i,j,sum;
  137. while(scanf("%I64d%I64d",&n,&m)!=EOF) {
  138. init();
  139. s=0;t=n+1;sum=0;
  140. for(i=1;i<=n;i++) {
  141. scanf("%I64d",&fee[i]);
  142. if(fee[i]>0) {
  143. add(s,i,fee[i]);
  144. sum+=fee[i];
  145. }
  146. else
  147. add(i,t,-fee[i]);
  148. }
  149. while(m--) {
  150. scanf("%I64d%I64d",&i,&j);
  151. add(i,j,inf);
  152. }
  153. cou=0;
  154. sum=sum-ISAP();
  155. memset(vis,0,sizeof(vis));
  156. dfs(0);
  157. printf("%I64d %I64d\n",cou-1,sum);
  158. }
  159. return 0;
  160. }

hdu 2987最大权闭合图模板类型题的更多相关文章

  1. hdu 3879 最大权闭合图(裸题)

    /* 裸的最大权闭合图 解:参见胡波涛的<最小割模型在信息学竞赛中的应用 #include<stdio.h> #include<string.h> #include< ...

  2. hdu 3879 hdu 3917 构造最大权闭合图 俩经典题

    hdu3879  base station : 各一个无向图,点的权是负的,边的权是正的.自己建一个子图,使得获利最大. 一看,就感觉按最大密度子图的构想:选了边那么连接的俩端点必需选,于是就以边做点 ...

  3. poj 2987(最大权闭合图+割边最少)

    题目链接:http://poj.org/problem?id=2987 思路:标准的最大权闭合图,构图:从源点s向每个正收益点连边,容量为收益:从每个负收益点向汇点t连边,容量为收益的相反数:对于i是 ...

  4. hdu 3061 hdu 3996 最大权闭合图 最后一斩

    hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...

  5. poj 2987 最大权闭合图

    Language: Default Firing Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 8744   Accept ...

  6. hdu 3917 (最大权闭合图)

    题意:政府有一些路,m个公司来修,每个公司修路要交税给政府,修路政府要付给公司费用,求政府能获得的最大利润,如果选择一个公司负责一个项目,那么该公司负责的其它项目也必须由他负责,并且与其有相连关系的公 ...

  7. hdu 3996 (最大权闭合图)

    题意:有n个区域布局,每个区域有一些金矿,挖开金矿需要一定的费用,可以得到一定的利润,要想挖开一个金矿,必须挖开所有在这个金矿上边的金矿,求最大利益,给的数据价值太大,用64位. 分析:如果一个金矿可 ...

  8. hdu 3061 (最大权闭合图)

    分析:城池之间有依赖关系,汇点与能获得兵力的城池连接,容量为可以获得的兵力,损耗兵力的城池与汇点连接容量为损耗的兵力,有依赖关系的城池间连边,容量为无穷大,跑网络流求出的最小割就是损耗的最小兵力,,, ...

  9. HDU 3917 最大权闭合图 求最小割

    具体参考http://blog.csdn.net/power721/article/details/6665750 TODO //#pragma comment(linker, "/STAC ...

随机推荐

  1. Java 枚举常见7种用法

    用法一:常量 在JDK1.5 之前,我们定义常量都是: publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. publ ...

  2. boa cgi程序cgi_header: unable to find LFLF

    ftp必须用二进制模式上传才可以 sqlite3 arm-linux-gcc hello.c -o hello.cgi -I /cgi/include -L /cgi/lib -static -lsq ...

  3. BigDecimal类型数据保留两位小数即百分比运算

    方法示例: DecimalFormat df = new DecimalFormat("0.00"); Object price = 2; Object price1 = 2.3; ...

  4. 用Latex写IEEE论文

    如果在搞科研,想在IEEE上发表文章,那么就不得不用IEEE的论文模板,分为doc版本和Tex版本.Tex是高德纳·纳什所写,大牛级的任务,写过<计算机程序设计艺术>,曾经是美国最年轻的科 ...

  5. ThreadLocal实现session中用户信息 的线程间共享

    转载自:http://blog.sina.com.cn/s/blog_4b5bc01101013gok.html ThreadLocal并不难理解,我总结的最简单的理解就是: ThreadLocal像 ...

  6. flex创建hashMap

    1,定义hashMap的接口. import flash.events.IEventDispatcher; import mx.events.CollectionEvent; /** *  Dispa ...

  7. Node.js:模块系统、函数

    为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块, ...

  8. 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...

  9. SQL Server更改排序规则的实现过程

    摘自: http://www.2cto.com/database/201112/115138.html 以下的文章主要向大家描述的是SQL Server更改排序规则的实现过程,以及在实现其实际操作过程 ...

  10. (C++)C++多态性中的静态绑定和动态绑定

    静态绑定和动态绑定是C++多态性的一种特性. 1.对象的静态类型和动态类型: 对象的静态类型: 对象在声明是采用的类型,在编译期确定: 对象的动态类型: 当前对象所指的类型,在运行期决定,对象的动态类 ...