最大获利 bzoj-1497

    题目大意:可以建立一个点,花费一定的代价;将已经建立的两个点之间连边,得到一定收益。有些节点之间是不允许连边的。

    注释:1<=点数<=5,000,1<=允许连边的边数<=50,000。

      想法:将每个可以相连的点之间的边在网络流里建立成一个节点,将源点连这条边的收获,向这两条边的端点分别连两条inf的边,所有的端点向源点连边权为该点代价的边。然后由最大流等于最小割,求最大流即可。

    最后,附上丑陋的代码... ...

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. int head[400010],to[400010],nxt[400010],tot=1;
  9. int dis[400100];
  10. int n,m;
  11. // int p[10010];
  12. int f[400010];
  13. inline void add(int x,int y,int z)
  14. {
  15. to[++tot]=y;
  16. f[tot]=z;
  17. nxt[tot]=head[x];
  18. head[x]=tot;
  19. }
  20. bool bfs()
  21. {
  22. queue<int> q;
  23. memset(dis,-1,sizeof dis);
  24. q.push(1);dis[1]=0;
  25. while(!q.empty())
  26. {
  27. int x=q.front();q.pop();
  28. for(int i=head[x];i;i=nxt[i])
  29. {
  30. if(f[i]>0&&dis[to[i]]==-1)
  31. {
  32. dis[to[i]]=dis[x]+1;
  33. q.push(to[i]);
  34. if(to[i]==n+m+2) return true;
  35. }
  36. }
  37. }
  38. return false;
  39. }
  40. int dinic(int x,int flow)
  41. {
  42. int a,temp=flow;
  43. if(x==n+m+2) return flow;
  44. for(int i=head[x];i;i=nxt[i])
  45. {
  46. if(f[i]>0&&dis[to[i]]==dis[x]+1)
  47. {
  48. a=dinic(to[i],min(f[i],temp));
  49. if(!a) dis[to[i]]=-1;
  50. temp-=a;
  51. f[i]-=a;
  52. f[i^1]+=a;
  53. if(!temp) break;
  54. }
  55. }
  56. return flow-temp;
  57. }
  58. int main()
  59. {
  60. cin >> n >> m;
  61. int all=n+m+2;
  62. for(int a,i=1;i<=n;i++)
  63. {
  64. cin >> a;
  65. add(1+m+i,all,a);
  66. add(all,1+m+i,0);
  67. }
  68. int sum=0;
  69. for(int a,b,c,i=1;i<=m;i++)
  70. {
  71. cin >> a >> b >> c;
  72. sum+=c;
  73. add(1,1+i,c);add(1+i,1,0);
  74. add(1+i,1+m+a,inf);add(1+m+a,1+i,0);
  75. add(1+i,1+m+b,inf);add(1+m+b,1+i,0);
  76. }
  77. int ans=0;
  78. while(bfs())
  79. {
  80. // puts("Fuck");
  81. ans+=dinic(1,inf);
  82. }
  83. cout << sum - ans << endl;
  84. return 0;
  85. }

    小结:最小割等于最大流

[bzoj1497][NOI2006]最大获利_网络流_最小割的更多相关文章

  1. 【BZOJ2229】[ZJOI2011]最小割(网络流,最小割树)

    [BZOJ2229][ZJOI2011]最小割(网络流,最小割树) 题面 BZOJ 洛谷 题解 戳这里 那么实现过程就是任选两点跑最小割更新答案,然后把点集划分为和\(S\)联通以及与\(T\)联通. ...

  2. 【CF331E】Biologist(网络流,最小割)

    [CF331E]Biologist(网络流,最小割) 题面 洛谷 翻译: 有一个长度为\(n\)的\(01\)串,将第\(i\)个位置变为另外一个数字的代价是\(v_i\). 有\(m\)个要求 每个 ...

  3. 【BZOJ1391】Order(网络流,最小割)

    [BZOJ1391]Order(网络流,最小割) 题面 BZOJ权限题... 良心洛谷 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成 ...

  4. 【BZOJ3144】切糕(网络流,最小割)

    [BZOJ3144]切糕(网络流,最小割) 题面 BZOJ 题解 这样的类型很有趣 先不考虑相邻距离差不能超过\(D\)的限制 我们考虑答案,显然就是在每个位置选一个最小的高度割就行了 化成最小割的模 ...

  5. BZOJ1497 [NOI2006]最大获利 网络流 最小割 SAP

    原文链接http://www.cnblogs.com/zhouzhendong/p/8371052.html 题目传送门 - BZOJ1497 题意概括 有n个站要被建立. 建立第i个站的花费为pi. ...

  6. BZOJ1497: [NOI2006]最大获利[最小割 最大闭合子图]

    1497: [NOI2006]最大获利 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 4375  Solved: 2142[Submit][Status] ...

  7. [bzoj2561]最小生成树_网络流_最小割_最小生成树

    最小生成树 bzoj-2561 题目大意:题目链接. 注释:略. 想法: 我们发现: 如果一条权值为$L$的边想加入到最小生成树上的话,需要满足一下条件. 就是求出原图的最小生成树之后,这个边当做非树 ...

  8. [bzoj4519][Cqoi2016]不同的最小割_网络流_最小割_最小割树

    不同的最小割 bzoj-4519 Cqoi-2016 题目大意:题目链接. 注释:略. 想法: 我们发现这和最小割那题比较像. 我们依然通过那个题说的办法一样,构建最小割树即可. 接下来就是随便怎么处 ...

  9. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

随机推荐

  1. dojo之FilteringSelect

    1.保证可视框宽度与下拉框宽度一致 forceWidth:'true' 2.控制下拉框的高度 maxHeight:'120'

  2. SQL注入攻击三部曲之高级篇

    SQL注入攻击三部曲之高级篇 经过了入门篇和进阶篇的学习,相信诸位想要破解一般的网站是没有什么问题了,但是先别得意.正所谓学海无涯,技术的进步也是没有止境的.SQL注入是一个看起来简单,但是变数很多的 ...

  3. Java求素数时出现错误

    Java求素数时出现错误 1.具体错误如下 No enclosing instance of type Prime is accessible. Must qualify the allocation ...

  4. Unhandled event loop exception No more handles

    1.错误描述 2.错误原因 3.解决办法

  5. VxWorks操作系统shell命令与调试方法总结

    VxWorks下的调试手段 主要介绍在Tornado集成开发环境下的调试方法,和利用支撑定位问题的步骤.思路. 1         Tornado的调试工具 嵌入式实时操作系统VxWorks和集成开发 ...

  6. C# 通过smtp服务器进行邮件发送 MailHelper

    C# 通过smtp服务器进行邮件发送 MailHelper.cs using System; using System.Data; using System.Configuration; using ...

  7. 微信开发中access_token,js_ticket,时间戳,签名生成工具

    Access_token生成工具 工具地址:https://mp.weixin.qq.com/debug 这个工具主要用来验证和生成微信公众号access_token,主要有正确的app_id和app ...

  8. Echarts自动刷新数据

    1.Echarts自动刷新数据 1.Echarts柱状图的正常配置 注:声明了 myChart.test这两个都有用 官方示例中myChart是声明在 function(ec)里面的 <scri ...

  9. Python Cookbook(第3版)中文版:15.15 C字符串转换为Python字符串

    15.15 C字符串转换为Python字符串¶ 问题¶ 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案¶ C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到 ...

  10. [ZJOI2007]时态同步

    题目描述 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点 ...