hdu 6118 度度熊的交易计划(可行费用流)

题目链接:hdu 6118 度度熊的交易计划

题意:

中文,说的很清楚了。

题解:

对着输入建一些图,跑一下可行费用流就行了,即当费用为正的时候就不跑了,这样就先满足了费用最小。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4
 5 namespace MCMF
 6 {
 7     const int N=1e5+7,inf=1e9+7;
 8     int u[N],v[N],cost[N],cap[N],g[N],nxt[N],ed,a[N],n;
 9     int S,T,d[N],Q[N],sumcost,flow,inq[N],p[N],now=1;
10     void adg(int s,int t,int c,int co)
11     {
12         int &x=ed;
13         u[x]=s,v[x]=t,cap[x]=c,cost[x]=co,nxt[x]=g[s],g[s]=x,x++;
14         u[x]=t,v[x]=s,cap[x]=0,cost[x]=-co,nxt[x]=g[t],g[t]=x,x++;
15     }
16     void init(int _n)
17     {
18         S=_n+1,T=_n+2,n=T,ed=0;
19         for(int i=0;i<=n;i++)g[i]=-1;
20     }
21     bool spfa()
22     {
23         for(int i=0;i<=n;i++)d[i]=inf;
24         d[S]=0,inq[S]=now,p[S]=0,a[S]=inf;
25         int head=1,tail=1;Q[1]=S;
26         while(head<=tail)
27         {
28             int x=Q[head++];
29             inq[x]--;
30             if(x==T)continue;
31             for(int i=g[x];~i;i=nxt[i])
32             {
33                 if(cap[i]>0&&d[v[i]]>d[x]+cost[i])
34                 {
35                     d[v[i]]=d[x]+cost[i];
36                     p[v[i]]=i,a[v[i]]=min(a[x],cap[i]);
37                     if(inq[v[i]]<now)inq[v[i]]=now,Q[++tail]=v[i];
38                 }
39             }
40         }
41         if(d[T]==inf||d[T]>=0)return 0;
42         flow+=a[T],sumcost+=d[T]*a[T];
43         int x=T;
44         while(x!=S)cap[p[x]]-=a[T],cap[p[x]^1]+=a[T],x=u[p[x]];
45         return 1;
46     }
47     int mcmf()
48     {
49         flow=sumcost=0;
50         while(spfa())now++;
51         return sumcost;
52     }
53 }
54
55 int n,m,a,b,c,d;
56
57 int main()
58 {
59     while(~scanf("%d%d",&n,&m))
60     {
61         MCMF::init(2*n);
62         F(i,1,n)
63         {
64             scanf("%d%d%d%d",&a,&b,&c,&d);
65             MCMF::adg(MCMF::S,i,b,a);
66             MCMF::adg(i,MCMF::T,d,-c);
67         }
68         F(i,1,m)
69         {
70             scanf("%d%d%d",&a,&b,&c);
71             if(a==b)continue;
72             MCMF::adg(a,b,2000,c);
73             MCMF::adg(b,a,2000,c);
74         }
75         printf("%d\n",-MCMF::mcmf());
76     }
77     return 0;
78 }

时间: 2024-12-28 13:17:25

hdu 6118 度度熊的交易计划(可行费用流)的相关文章

HDU 6118 度度熊的交易计划 最大费用可行流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要花费 a[i] 元,且上限为 b[i] ,所以我们从 s 向这些点之间连一条容量为 b[i] ,费用为 a[i] 的边.同样的道理,出售一个商品可以赚到 c[i] 元,最多出售 d[i] 个,于是我们从这些点向 t 连一条容量为 d[i] ,费用为 -c[i] 的边.最后所有的公路也是花费,从 u

HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 254    Accepted Submission(s): 80 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

(最小费用流)hdu 6118(2017百度之星初赛B 1005) 度度熊的交易计划

度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 260    Accepted Submission(s): 83 Problem Description 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片

【HDOJ6118】度度熊的交易计划(最小费用流)

题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个. 同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品. 由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益. 据测算,每一个商品运输1公里,将会花费1元. 那么喵哈哈村最多能够实现多少盈利呢? 1<=n<=500,

[HDOJ6118] 度度熊的交易计划(最小费用可行流)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 这个建图炒鸡简单,中间的图去掉重边后丢进去就行. 建图的时候费用实际上是价值,所以正的费用就不用跑了,相当于求费用可行流. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 1

2017&quot;百度之星&quot;程序设计大赛 - 初赛(B)度度熊的交易计划

n个村庄m条带权路,权值为花费,村庄可以造东西卖东西,造完东西可以换地方卖,给出每个村庄造东西花费a和最多个数b.卖东西价值c和最多个数d,求最大收益. 裸的费用流.然而还WA了一发.很好. 建源向每个村庄连边(b,a),(b,a)表示容量b费用a,每个村庄向汇点连边(d,-c),村庄间有路就互相连边(inf,v),v为边权,然后就是最小费用流. 不是最小费用最大流!!把费用最大流SPFA中最后一句判断改成<0即可,因为>=0时的费用可以不要他. 1 #include<stdio.h&g

HDU 3376 &amp;&amp; 2686 方格取数 最大和 费用流裸题

题意: 1.一个人从[1,1] ->[n,n] ->[1,1] 2.只能走最短路 3.走过的点不能再走 问最大和. 对每个点拆点限流为1即可满足3. 费用流流量为2满足1 最大费用流,先给图取负,结果再取负,满足2 #include <stdio.h> #include <string.h> #include <iostream> #include <math.h> #include <queue> #include <set&

【判连通】HDU 6113 度度熊的01世界

http://acm.hdu.edu.cn/showproblem.php?pid=6113 [题意] 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0的定义:存在1字符且1字符只能是由一个连通块组成,存在且仅存在一个由0字符组成的连通块完全被1所包围. 图像1的定义:存在1字符且1字符只能是由一个连通块组成,不存在任何0字符组成的连通块被1所完全包围. 连通的含义是,只要连续两个方

HDU 6113 度度熊的01世界 【DFS】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(A))

度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1117    Accepted Submission(s): 400 Problem Description 度度熊是一个喜欢计算机的孩子,在计算机的世界中,所有事物实际上都只由0和1组成. 现在给你一个n*m的图像,你需要分辨他究竟是0,还是1,或者两者均不是. 图像0