题意:C公司有一些资源,每种只有1个,有A、B两个公司分别对其中一些资源进行分组竞标,每组竞标对一些资源出一个总价。问C公司的最大收益。

解法:最小割。将A公司的竞标与源点相连,B公司的与汇点相连,边容量为竞标价。而A、B公司的竞标中有资源冲突的竞标之间连一条边,容量为INF。这样的最大收益就是 总竞标出价-割去竞标的边的价格的最小值。

问题!!dinic函数那里,我竟然2种打法相差了近乎3秒,也就是dfs函数流了很多次。。。(゚Д゚≡゚Д゚)

  1. 1 #include<cstdio>
  2. 2 #include<cstdlib>
  3. 3 #include<cstring>
  4. 4 #include<iostream>
  5. 5 #include<queue>
  6. 6 using namespace std;
  7. 7
  8. 8 const int M=6100,N=300010,P=35,NN=6100,MM=240000,INF=1010;
  9. 9 int m,mm,len;
  10. 10 int id[N],last[NN],d[NN];
  11. 11 struct edge{int y,fl,next;}a[MM];
  12. 12 queue<int> q;
  13. 13
  14. 14 int mmin(int x,int y) {return x<y?x:y;}
  15. 15 void ins(int x,int y,int fl)
  16. 16 {
  17. 17 a[++len].y=y,a[len].fl=fl;
  18. 18 a[len].next=last[x],last[x]=len;
  19. 19 a[++len].y=x,a[len].fl=0;
  20. 20 a[len].next=last[y],last[y]=len;
  21. 21 }
  22. 22 bool bfs(int st,int ed)
  23. 23 {
  24. 24 while (!q.empty()) q.pop();
  25. 25 memset(d,0,sizeof(d));
  26. 26 q.push(st), d[st]=1;
  27. 27 while (!q.empty())
  28. 28 {
  29. 29 int x=q.front(); q.pop();
  30. 30 for (int i=last[x];i;i=a[i].next)
  31. 31 {
  32. 32 int y=a[i].y;
  33. 33 if (!a[i].fl||d[y]) continue;
  34. 34 d[y]=d[x]+1, q.push(y);
  35. 35 }
  36. 36 }
  37. 37 return d[ed];
  38. 38 }
  39. 39 int dfs(int x,int flow,int ed)
  40. 40 {
  41. 41 if (x==ed) return flow;
  42. 42 int h=0;
  43. 43 for (int i=last[x];i;i=a[i].next)
  44. 44 {
  45. 45 int y=a[i].y;
  46. 46 if (!a[i].fl||d[y]!=d[x]+1) continue;
  47. 47 int t=dfs(y,mmin(flow-h,a[i].fl),ed);
  48. 48 h+=t;
  49. 49 a[i].fl-=t,a[i^1].fl+=t;
  50. 50 if (h==flow) break;
  51. 51 }
  52. 52 if (!h) d[x]=0;
  53. 53 return h;
  54. 54 }
  55. 55 int Max_flow(int st,int ed)
  56. 56 {
  57. 57 int h=0,p;
  58. 58 while(bfs(st,ed)) //h+=dfs(st,INF,ed);//slower a lot,very strange......
  59. 59 while(p=dfs(st,INF,ed)) h+=p;
  60. 60 return h;
  61. 61 }
  62. 62 int main()
  63. 63 {
  64. 64 int T;
  65. 65 scanf("%d",&T);
  66. 66 for (int kase=1;kase<=T;kase++)
  67. 67 {
  68. 68 int d,x; char c;
  69. 69 int st=1,ed=2,sum=0;
  70. 70 len=1;
  71. 71 memset(last,0,sizeof(last));
  72. 72 memset(id,0,sizeof(id));
  73. 73 scanf("%d",&m);
  74. 74 for (int i=1;i<=m;i++)
  75. 75 {
  76. 76 scanf("%d",&d); c=getchar();
  77. 77 sum+=d, ins(st,i+2,d);
  78. 78 while (c!='\n')
  79. 79 {
  80. 80 scanf("%d",&x);
  81. 81 id[x]=i+2, c=getchar();
  82. 82 }
  83. 83 }
  84. 84 scanf("%d",&mm);
  85. 85 for (int i=1;i<=mm;i++)
  86. 86 {
  87. 87 scanf("%d",&d); c=getchar();
  88. 88 sum+=d, ins(i+m+2,ed,d);
  89. 89 while (c!='\n')
  90. 90 {
  91. 91 scanf("%d",&x);
  92. 92 if (id[x]) ins(id[x],i+m+2,INF);
  93. 93 c=getchar();
  94. 94 }
  95. 95 }
  96. 96 int ans=Max_flow(st,ed);
  97. 97 printf("Case %d:\n%d\n",kase,sum-ans);
  98. 98 if (kase<T) printf("\n");
  99. 99 }
  100. 100 return 0;
  101. 101 }

【LA 3487】Duopoly(图论--网络流最小割 经典题)的更多相关文章

  1. 【uva 1515】Pool construction(图论--网络流最小割 模型题)

    题意:有一个水塘,要求把它用围栏围起来,每个费用为b.其中,(#)代表草,(.)代表洞,把一个草变成洞需要费用d, 把一个洞变成草需要费用f.请输出合法方案中的最小费用. 解法:(不好理解...... ...

  2. 【UVALive - 3487】 Duopoly(网络流-最小割)

    Description The mobile network market in country XYZ used to be dominated by two large corporations, ...

  3. 图论--网络流--最小割 HDU 2485 Destroying the bus stations(最短路+限流建图)

    Problem Description Gabiluso is one of the greatest spies in his country. Now he's trying to complet ...

  4. 【hdu 4859】海岸线(图论--网络流最小割)

    题意:有一个区域,有'.'的陆地,'D'的深海域,'E'的浅海域.其中浅海域可以填充为陆地.这里的陆地区域不联通,并且整个地图都处在海洋之中.问填充一定浅海域之后所有岛屿的最长的海岸线之和. 解法:最 ...

  5. 最小割经典题(两个点依附在一起的情况)poj3469

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 25099   Accepted: 10866 ...

  6. 【bzoj1976】[BeiJing2010组队]能量魔方 Cube 网络流最小割

    题目描述 一个n*n*n的立方体,每个位置为0或1.有些位置已经确定,还有一些需要待填入.问最后可以得到的 相邻且填入的数不同的点对 的数目最大. 输入 第一行包含一个数N,表示魔方的大小. 接下来 ...

  7. 【bzoj4177】Mike的农场 网络流最小割

    题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i] ...

  8. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  9. 【bzoj2229】[Zjoi2011]最小割 分治+网络流最小割

    题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...

随机推荐

  1. vue-vite浅析

    大家好,我是小雨小雨,致力于分享有趣的.实用的文章. 内容分为原创和翻译,如果有问题,欢迎随时评论或私信,很乐意和大家一起探讨,一起进步. 分享不易,希望能够得到大家的支持和关注. vite出了好久了 ...

  2. Both Dolby Atmos driver and API need to be installed问题的一个解决方法

    问题的原因在于缺少以下两个部分: Dolby Atmos driver:指你的声卡驱动中自带的杜比文件 如果驱动里没有,说明你的硬件可能不支持杜比,或者驱动太老没有包含杜比. Dolby Atmos ...

  3. LeetCode145 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * Defin ...

  4. Centos7安装Jenkins和目录迁移

    Centos7安装Jenkins和目录迁移 内容: 安装Jenkins和相关的配置 尝试目录迁移,模拟磁盘空间不足 1. 安装Jenkins和配置 安装 根据Jenkins的官方安装指引,安装步骤如下 ...

  5. 通过show profile分析sql语句

    set profling=1; select count(*) from xuehao; show profiles; show profile for query 1; mysql> set ...

  6. 【葵花宝典】kolla部署OpenStack-AllinOne

    1.关闭防火墙以及内核安全机制 systemctl stop firewalld systemctl disable firewalld ##永久性关闭 setenforce 0 sed -i 's/ ...

  7. C# ADO.NET连接字符串详解

    C#中连接字符串包含以下内容 参数 说明 Provider 设置或者返回提供的连接程式的名称,仅用于OLeDbConnection对象 Connection Timeout 在终止尝试并产生异常前,等 ...

  8. scp等不需要存入know_host

    1.修改sshd的配置文件 vi /etc/ssh/ssh_config 修改为如下 StrictHostKeyChecking no UserKnownHostsFile /dev/null 重启s ...

  9. centos7+宝塔+ssrpanel v3 魔改版 前后端配置教程

    一.服务端 1.安装宝塔 登录 SSH 后,直接安装宝塔. yum install -y wget && wget -O install.sh http://download.bt.c ...

  10. 使用fdopen对python进程产生的文件进行权限最小化配置

    需求背景 用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置.对于一些安全性较高的系统,如果我们创建的文件权限其他用户或者同一用户组里的其他用户有可读权限的话,有可能导致不必 ...