题目链接

思路

对于每个中转站向\(T\)连一条权值为建这个中转站代价的边。割掉这条边表示会建这个中转站。

对于每个人向他的两个中转站连一条权值为\(INF\)的边。然后从\(S\)向这个人连一条权值为这个人的收益的边,割掉这条边表示不要这个收益。

这就是最大权闭合子图的模型。

最后的答案=全部的收益-割掉的收益-建中转站的代价=全部收益-最小割

代码

  1. #include<cstring>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<cstdio>
  5. #include<iostream>
  6. #include<cstdlib>
  7. #include<cmath>
  8. #include<ctime>
  9. #include<bitset>
  10. using namespace std;
  11. typedef long long ll;
  12. const int N = 100010,M = 1000010,INF = 1e9;
  13. ll read() {
  14. ll x=0,f=1;char c=getchar();
  15. while(c<'0'||c>'9') {
  16. if(c=='-') f=-1;
  17. c=getchar();
  18. }
  19. while(c>='0'&&c<='9') {
  20. x=x*10+c-'0';
  21. c=getchar();
  22. }
  23. return x*f;
  24. }
  25. struct node {
  26. int v,nxt,w;
  27. }e[M << 1];
  28. int head[N],ejs = 1;
  29. void add(int u,int v,int w) {
  30. e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;e[ejs].w = w;
  31. e[++ejs].v = u;e[ejs].nxt = head[v];head[v] = ejs;e[ejs].w = 0;
  32. }
  33. int S,T;
  34. int n,m,cur[N];
  35. queue<int>q;
  36. int dep[N];
  37. int bfs() {
  38. while(!q.empty()) q.pop();
  39. memset(dep,0,sizeof(dep));
  40. dep[S] = 1;q.push(S);
  41. while(!q.empty()) {
  42. int u = q.front();q.pop();
  43. for(int i = head[u];i;i = e[i].nxt) {
  44. int v = e[i].v;
  45. if(!dep[v] && e[i].w) {
  46. dep[v] = dep[u] + 1;q.push(v);
  47. if(v == T) return 1;
  48. }
  49. }
  50. }
  51. return 0;
  52. }
  53. int dfs(int u,int now) {
  54. if(u == T) return now;
  55. int ret = 0;
  56. for(int &i = cur[u];i;i = e[i].nxt) {
  57. int v = e[i].v;
  58. if(dep[v] == dep[u] + 1 && e[i].w) {
  59. int k = dfs(v,min(now - ret,e[i].w));
  60. ret += k;
  61. e[i].w -= k;
  62. e[i ^ 1].w += k;
  63. if(ret == now) return ret;
  64. }
  65. }
  66. return ret;
  67. }
  68. int dinic() {
  69. int ans = 0;
  70. while(bfs()) {
  71. for(int i = 1;i <= T;++i) cur[i] = head[i];
  72. ans += dfs(S,INF);
  73. }
  74. return ans;
  75. }
  76. int main() {
  77. n = read(),m = read();
  78. T = n + m + 2,S = T - 1;
  79. int tot = 0;
  80. for(int i = 1;i <= n;++i) {
  81. int w = read();
  82. add(i,T,w);
  83. }
  84. for(int i = 1;i <= m;++i) {
  85. int x = read(),y = read(),w = read();
  86. add(i + n,x,INF);add(i + n,y,INF);
  87. add(S,i + n,w);
  88. tot += w;
  89. }
  90. cout<<tot - dinic();
  91. return 0;
  92. }

bzoj1497 最大获利(最大权闭合子图)的更多相关文章

  1. P4174 [NOI2006]最大获利 (最大权闭合子图)

    P4174 [NOI2006]最大获利 (最大权闭合子图) 题目链接 题意 建\(i\)站台需要\(p_i\)的花费,当\(A_i,B_i\)都建立时获得\(C_i\)的利润,求最大的利润 思路 最大 ...

  2. BZOJ1497[NOI2006]最大获利——最大权闭合子图

    题目描述 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一项,就需要完成 ...

  3. bzoj1497 [NOI2006]最大获利 最大权闭合子图

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路 最大权闭合子图的裸题 一开始知道是这个最大权闭合子图(虽然我不知道名字),但是我 ...

  4. 【BZOJ】1497: [NOI2006]最大获利 最大权闭合子图或最小割

    [题意]给定n个点,点权为pi.m条边,边权为ci.选择一个点集的收益是在[点集中的边权和]-[点集点权和],求最大获利.n<=5000,m<=50000,0<=ci,pi<= ...

  5. COGS28 [NOI2006] 最大获利[最大权闭合子图]

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  6. BZOJ 1497 最大获利(最大权闭合子图)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1497 思路:由题意可以得知,每个顾客都依赖2个中转站,那么让中转站连有向边到汇点,流量为它的建设费用 ...

  7. 【最大权闭合子图】BZOJ1497[NOI2006]-最大获利

    [题目大意] 建立第i个通讯中转站需要的成本为Pi(1≤i≤N).另外公司调查得出了所有期望中的用户群,一共M个.关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进 ...

  8. 【最大权闭合子图 最小割】bzoj1497: [NOI2006]最大获利

    最大权闭合子图的模型:今天才发现dinic板子是一直挂的…… Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在 ...

  9. bzoj1497: [NOI2006]最大获利(最大权闭合子图)

    1497: [NOI2006]最大获利 题目:传送门 题解: %%%关于最大权闭合子图很好的入门题 简单说一下什么叫最大权闭合子图吧...最简单的解释就是正权边连源点,负权边连汇点(注意把边权改为正数 ...

随机推荐

  1. .Net在操作mysql查询的时候出现“: Unknown column 'UserName' in 'where clause'”错误

    今天使用.Net操作mysql查询的时候,如果加上条件查询的时候就会出现 Unknown column 'UserName' in 'where clause'这个错,不加条件直接select * f ...

  2. js 首次进入弹窗

    今天有个需求,首次进入需要弹窗,然后就在网上找了下,虽然看了很多但是说的都不是我想要的,最后终于到了一个合适的. function get_cookie(Name) { var search = Na ...

  3. Google css & Google fonts

    最近用某开源模板做提案的时候, 抓包工具老是有外部Request. 问题出在某css中有这么一句: @import url(https://fonts.googleapis.com/css?famil ...

  4. linux 挂载windows下目录,其它linux机器nfs的目录,自己dd的文件

    如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ 挂载window下共享的目录 //192.168.0.11/share /mnt 挂载其它linux机器下目录 ...

  5. QTP 自动化测试--定义变量

    1 Dim suffixsuffix=get_currentdatetxt("001")

  6. java、二维数组详解!

    /* java 二维数组的概念 使用方法! 1.什么是二维数组? 答案:数组的数组! 他的每一个元素都是数组!二维数组是(存储一维数组的)一维数组. 2.如何定义?(以二维数组为列) int arr[ ...

  7. Oracle minus用法详解及应用实例

    本文转载:https://blog.csdn.net/jhon_03/article/details/78321937 Oracle minus用法 “minus”直接翻译为中文是“减”的意思,在Or ...

  8. 魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...

  9. Linux 学习 (一) Linux简介

    Linux达人养成计划 I 学习笔记 Linux 内核官网:www.kernel.org 内核版本说明:主版本.次版本.末版本,如2.6.18 Linux 主要发行版本 RedHat: 服务器领域,部 ...

  10. React 学习(六) ---- 父子组件之间的通信

    当有多个组件需要共享状态的时候,这就需要把状态放到这些组件共有的父组件中,相应地,这些组件就变成了子组件,从而涉及到父子组件之间的通信.父组件通过props 给子组件传递数据,子组件则是通过调用父组件 ...