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

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

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

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

    序章 时光疾驰,从事IT行业已两年有余. 16年11月开始自学Java,从此开启自学之路,后来实习期自学大数据.python.爬虫等,最终成长为一名平凡的程序员.回首望去,一路上的过往历历在目,有初学 ...

  2. (二)数据源处理3-python处理包含合并单元格的excel

    分析:

  3. /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS --start-pos=307

    /usr/local/mysql/bin/mysqlbinlog -vv /var/lib/bin/mysql-bin.000008 --base64-output=DECODE-ROWS  --st ...

  4. Android事件分发机制二:viewGroup与view对事件的处理

    前言 很高兴遇见你~ 在上一篇文章 Android事件分发机制一:事件是如何到达activity的? 中,我们讨论了触摸信息从屏幕产生到发送给具体 的view处理的整体流程,这里先来简单回顾一下: 触 ...

  5. SourceGenerator入门指北

    SourceGenerator介绍 SourceGenerator于2020年4月29日在微软的.net blog首次介绍,大概说的是开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代 ...

  6. FLask的偏函数应用

    偏函数 实际上,偏函数主要辅助原函数,作用其实和原函数差不多,不同的是,我们要多次调用原函数的时候,有些参数,我们需要多次手动的去提供值.而偏函数便可简化这些操作,减少函数调用,主要是将一个或多个参数 ...

  7. Py-多态,封装,反射,描述符,包装标准类型,面向对象进阶

    多态: 对象可以通过他们共同的属性和动作来访问,而不需要考虑他们的类多态是继承的应用 class H2o: def __init__(self,temp): self.temp=temp def ht ...

  8. Docker数据目录迁移解决方案

    场景 在docker的使用中随着下载镜像越来越多,构建镜像.运行容器越来越多, 数据目录必然会逐渐增大:当所有docker镜像.容器对磁盘的使用达到上限时,就需要对数据目录进行迁移. 如何避免: 1. ...

  9. LiteOS调测利器:backtrace函数原理知多少

    摘要:本文将会和读者分享LiteOS 5.0版本中Cortex-M架构的backtrace软件原理及实现,供大家参考和学习交流. 原理介绍 汇编指令的执行流程 图 1 汇编指令的执行顺序 上图1所示, ...

  10. python基础之 列表、元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码

    本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...