【LA 3487】Duopoly(图论--网络流最小割 经典题)

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

解法:最小割。将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 }
时间: 2024-10-25 00:06:09

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

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

Description The mobile network market in country XYZ used to be dominated by two large corporations, XYZTelecom and XYZ Mobile. The central government recently has realized that radio frequency spectrumis a scarce resource and wants to regulate its u

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

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 25099   Accepted: 10866 Case Time Limit: 5000MS Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft C

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

题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划分为N×M块小区域.GDOI要求将这些区域分为商业区和工业区来开发.根据不同的地形环境,每块小区域建造商业区和工业区能取得不同的经济价值.更具体点,对于第i行第j列的区域,建造商业区将得到Aij收益,建造工业区将得到Bij收益.另外不同的区域连在一起可以得到额外的收益,即如果区域(I,j)相邻(相邻

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

题目描述 Mike有一个农场,这个农场n个牲畜围栏,现在他想在每个牲畜围栏中养一只动物,每只动物可以是牛或羊,并且每个牲畜围栏中的饲养条件都不同,其中第i个牲畜围栏中的动物长大后,每只牛可以卖a[i]元,每只羊可以卖b[i]元,为了防止牛羊之间相互影响,Mike找到了m条规律,每条规律给出一个三元组(i, j, k)表示如果第i个围栏和第j个围栏养的是不同的动物,那么Mike就需要花费k的代价请人帮忙处理牛羊之间的影响.不过同时Mike也发现k条特殊的规则(S, a, b),表示如果S中所有牲畜

【bzoj3144】[Hnoi2013]切糕 网络流最小割

题目描述 输入 第一行是三个正整数P,Q,R,表示切糕的长P. 宽Q.高R.第二行有一个非负整数D,表示光滑性要求.接下来是R个P行Q列的矩阵,第z个 矩阵的第x行第y列是v(x,y,z) (1≤x≤P, 1≤y≤Q, 1≤z≤R). 100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000. 输出 仅包含一个整数,表示在合法基础上最小的总不和谐值. 样例输入 2 2 2 1 6 1 6 1 2 6 2 6 样例输出 6 题目大意 给定一个p行q列的矩阵,每个位置可以

二分图&amp;网络流&amp;最小割等问题的总结

二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 带下界网络流 最小割问题的总结: *意义 1.加inf的边表示不能被割,通常用于体现某个点必须属于某个集合 连边(s,u,w)代表如果u不在s割的话需要付出代价w 2.连边(u,v,w)代表如果u在s割,v在t割需要付出代价w 但注意,如果u在t割,v在s割是不需要付出代价的. 那么如果连边(u,v,w)以及(v,u,w)则说明当u与v所属割不同的时候需要付出代价w *

HDU 2435 There is a war (网络流-最小割)

There is a war Problem Description There is a sea. There are N islands in the sea. There are some directional bridges connecting these islands. There is a country called Country One located in Island 1. There is another country called Country Another

【bzoj3630】[JLOI2014]镜面通道 对偶图+计算几何+网络流最小割

题目描述 在一个二维平面上,有一个镜面通道,由镜面AC,BD组成,AC,BD长度相等,且都平行于x轴,B位于(0,0).通道中有n个外表面为镜面的光学元件,光学元件α为圆形,光学元件β为矩形(这些元件可以与其他元件和通道有交集,具体看下图).光线可以在AB上任一点以任意角度射入通道,光线不会发生削弱.当出现元件与元件,元件和通道刚好接触的情况视为光线无法透过(比如两圆相切).现在给出通道中所有元件的信息(α元件包括圆心坐标和半径xi,yi,ri,β元件包括左下角和右上角坐标x1,y1,x2,y2

【bzoj2127】happiness 网络流最小割

题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. 输入 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值.第二个矩阵为n行m列 此矩阵的第i行