经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法。

题意:输入n个点,m条边的无向图。点权为负,边权为正,点权为代价,边权为获益,输出最大获益。

(最大权闭合子图:图中各点的后继必然也在图中)

构图攻略:将边看做点,

若选某条边e[i](u,v,w),则必须选点u,v。由此构成一个有向图。也符合最大权闭合子图模型。

对原本的边e[i](u,v,w)连3条边(S,n+i,w),(n+i,u,inf),(n+i,v,inf)。

对原本的点v,连1条边(v,T,p[v])。

即正权点与源点连,负权点与汇点连。

求最大流,记所有边的正权和为sum,则sum-maxflow就是答案。

显然,sap图的点有n+m+2,边有(n+m*3)*2。

具体证明推导请移步前辈的论文或者别的网站也有很详细的介绍和步骤。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <string>
  8. #include <set>
  9. #include <queue>
  10. using namespace std;
  11.  
  12. #define ll long long
  13. #define MP make_pair
  14.  
  15. #define mxn 56000
  16. #define mxe (51000*4*2)
  17. #define inf 1e9
  18. #define eps 1e-8
  19.  
  20. struct SAP{
  21. int dis[mxn],pre[mxn],gap[mxn],arc[mxn];
  22. int f[mxe],cap[mxe];
  23. int head[mxn],nxt[mxe],vv[mxe],e;
  24. void init(){e=0;memset(head,-1,sizeof(head));}
  25. void add(int u,int v,int c){
  26. vv[e]=v,cap[e]=c,nxt[e]=head[u],head[u]=e++;
  27. vv[e]=u,cap[e]=0,nxt[e]=head[v],head[v]=e++;
  28. }
  29. ll max_flow(int s,int t,int n){
  30. int q[mxn],j,mindis;
  31. ll ans=0;
  32. int ht=0,tl=1,u,v;
  33. int low;
  34. bool found,vis[mxn];
  35. memset(dis,0,sizeof(dis));
  36. memset(gap,0,sizeof(gap));
  37. memset(vis,0,sizeof(vis));
  38. memset(arc,-1,sizeof(arc));
  39. memset(f,0,sizeof(f));
  40. q[0]=t;vis[t]=true;dis[t]=0;gap[0]=1;
  41. while(ht<tl){
  42. u=q[ht++];
  43. for(int i=head[u];i!=-1;i=nxt[i]){
  44. v = vv[i];
  45. if(!vis[v]){
  46. vis[v]=true;
  47. dis[v]=dis[u]+1;
  48. q[tl++]=v;
  49. gap[dis[v]]++;
  50. arc[v]=head[v];
  51. }
  52. }
  53. }
  54. u=s;low=inf;pre[s]=s;
  55. while(dis[s]<n){
  56. found=false;
  57. for(int &i=arc[u];i!=-1;i=nxt[i]){
  58. if(dis[vv[i]]==dis[u]-1 && cap[i]>f[i]){
  59. found=true;v=vv[i];
  60. low=min(low,cap[i]-f[i]);
  61. pre[v]=u;u=v;
  62. if(u==t){
  63. while(u!=s){
  64. u=pre[u];
  65. f[arc[u]]+=low;
  66. f[arc[u]^1]-=low;
  67. }
  68. ans+=low;low=inf;
  69. }
  70. break;
  71. }
  72. }
  73. if(found) continue;
  74. mindis=n;
  75. for(int i=head[u];i!=-1;i=nxt[i]){
  76. if(mindis>dis[vv[i]] && cap[i]>f[i]){
  77. mindis=dis[vv[j=i]];
  78. arc[u]=i;
  79. }
  80. }
  81. if(--gap[dis[u]]==0) return ans;
  82. dis[u]=mindis+1;
  83. gap[dis[u]]++;
  84. u=pre[u];
  85. }
  86. return ans;
  87. }
  88. }sap;
  89. int p[5050];
  90. int main(){
  91. int n,m;
  92. while(~scanf("%d%d",&n,&m)){
  93. for(int i=1;i<=n;++i) scanf("%d",p+i);
  94. ll sum = 0;
  95. sap.init();
  96. for(int i=1;i<=m;++i){
  97. int a,b,c;
  98. scanf("%d%d%d",&a,&b,&c);
  99. sap.add(n+m+1,n+i,c);
  100. sap.add(n+i,a,inf);
  101. sap.add(n+i,b,inf);
  102. sum+=c;
  103. }
  104. for(int i=1;i<=n;++i)
  105. sap.add(i,n+m+2,p[i]);
  106. ll mf = sap.max_flow(n+m+1,n+m+2,n+m+2);
  107. printf("%I64d\n",sum-mf);
  108. }
  109. return 0;
  110. }

HDU 3879 Base Station(最大权闭合子图)的更多相关文章

  1. HDU 3879 Base Station(最大权闭合子图)

    将第i个用户和他需要的基站连边,转化成求二分图的最大权闭合子图. 答案=正权点之和-最小割. # include <cstdio> # include <cstring> # ...

  2. hdu 3879 Base Station 最大权闭合图

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 A famous mobile communication company is plannin ...

  3. hdu3879 Base Station 最大权闭合子图 边权有正有负

    /** 题目:hdu3879 Base Station 最大权闭合子图 边权有正有负 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3879 题意:给出n个 ...

  4. HDU 3879 Base Station

    Base Station Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...

  5. hdu 5772 String problem 最大权闭合子图

    String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...

  6. hdu 3917 Road constructions 最大权闭合子图

    样例说明: n(城市数目)   m(工程队数目) 每个工程队上交的税收 val[i] k(k个工程) xi   yi  ci  costi , 工程队ci承包由xi到yi,政府的补贴为costi 注意 ...

  7. HDU 5855 Less Time, More profit 最大权闭合子图

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5855 Less Time, More profit Time Limit: 2000/1000 MS ...

  8. HDU4971 A simple brute force problem.(强连通分量缩点 + 最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4971 Description There's a company with several ...

  9. HDU5855 Less Time, More profit(最大权闭合子图)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5855 Description The city planners plan to build ...

随机推荐

  1. 匿名内部类与equals之学习要扎实

    匿名内部类是胡哥给我上的第一节课,他一直在不断强调着“逻辑与思维”的重要性, 遇到问题不能用“不知道和没学过”去逃避它,所有的不知道和没教过都源自于没见过,一定要学会去看源代码,不要人云亦云..... ...

  2. Prince2七大原则(4)

    我们先来回顾一下,PRINCE2七大原则分别是持续的业务验证,经验学习,角色与责任,按阶段管理,例外管理,关注产品,剪裁. 第四个原则:按阶段管理. 阶段管理其实是给高层提供了项目生命周期中相对应的控 ...

  3. Dedecms去掉URL中a目录的方法

    本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...

  4. Python删除指定时间的文件

    import os import time import sys from xml.dom import minidom, Node from xml.dom.minidom import parse ...

  5. RabbitMQ 消息确认机制

    消息确认机制 在之前异常处理部分就已经写了,对于consumer的异常退出导致消息丢失,可以时候consumer的消息确认机制.重复的就不说了,这里说一些不一样的. consumer的消息确认机制 当 ...

  6. mysql 函数 GROUP_CONCAT 单元格中最长字符串和excel导出问题

    GROUP_CONCAT 使用方式GROUP_CONCAT ([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) SELECT ...

  7. JQuery中$.ajax()方法参数详解(转载)

    url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...

  8. 一个ERP项目实施工程师的若干体会

    本人在多年的工作中,参与了ERP的研发和实施,对ERP有较深的认识.在这里,根据自已的实施过程中的一些经历,把自已在实践中的一些体会贡献出来和大家共享,由于时间和精力所限,内容难免有不当之处,挂一漏万 ...

  9. yii2 codeception程序功能测试

    原文地址: http://www.360us.net/article/35.html http://blog.csdn.net/enoch612/article/details/48679069 ht ...

  10. IntersectionObserver API

    温馨提示:本文目前仅适用于在 Chrome 51 及以上中浏览. 2016.11.1 追加,Firefox 52 也已经实现. 2016.11.29 追加,Firefox 的人担心目前规范不够稳定,未 ...