2017百度之星初赛:B-1005. 度度熊的交易计划(最小费用流)
度度熊的交易计划
度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:
喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区。
由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。
同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。
由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益。
据测算,每一个商品运输1公里,将会花费1元。
那么喵哈哈村最多能够实现多少盈利呢?
本题包含若干组测试数据。 每组测试数据包含: 第一行两个整数n,m表示喵哈哈村由n个片区、m条街道。 接下来n行,每行四个整数a[i],b[i],c[i],d[i]表示的第i个地区,能够以a[i]的价格生产,最多生产b[i]个,以c[i]的价格出售,最多出售d[i]个。 接下来m行,每行三个整数,u[i],v[i],k[i],表示该条公路连接u[i],v[i]两个片区,距离为k[i]
可能存在重边,也可能存在自环。
满足: 1<=n<=500, 1<=m<=1000, 1<=a[i],b[i],c[i],d[i],k[i]<=1000, 1<=u[i],v[i]<=n
输出最多能赚多少钱。
2 1 5 5 6 1 3 5 7 7 1 2 1
23
最小费用流
源点与所有点连接一条流量为最大生产数量b[i],费用为a[i]的边
所有点与汇点连接一条流量为最大出售量d[i],费用为-c[i]的边
然后如果点u和点v间有条长度为len的路径,则点u和点v连一条流量为inf,费用为len的边(注意是双向的)
这里别忘了去掉自环,重边保留最短
理论上之后求最小费用最大流就好了
但真的是最大流么?显然不一定
因为最大流也意味着所有点的商品都必须全部卖到最大出售量或者所有点的商品都买完最大生产量
这样显然是不对的,如果完全没法获得利润的话不如一个商品都不买
那怎么办
所有点与汇点再连接一条流量为最大生产数量b[i],费用为-a[i]的边就好了
这样子就相当于东西可以不买,再求的最小费用最大流就是答案了
直接套模板吧
#include<queue>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
#define inf 1044266558
typedef struct Res
{int next;int to, from;int flow, cost;
}Road;
Road G[2000005];
int head[505], vis[505], dis[505], road[505][505], S, T, cnt, ans;
int a[505], b[505], c[505], d[505];
int Read()
{int x = 0, f = 1;char ch;ch = getchar();while(ch<'0' || ch>'9'){if(ch=='-') f = -1;ch = getchar();}while(ch>='0' && ch<='9')x = x*10+ch-'0', ch = getchar();return x*f;
}
void Add(int u, int v, int flow, int cost)
{cnt++;G[cnt].next = head[u];head[u] = cnt;G[cnt].from = u;G[cnt].to = v;G[cnt].flow = flow;G[cnt].cost = cost;
}
int SPFA()
{int now, i, v;queue<int> q;memset(vis, 0, sizeof(vis));memset(dis, 62, sizeof(dis));q.push(S);vis[S] = 1;dis[S] = 0;while(q.empty()==0){now = q.front();q.pop();vis[now] = 0;for(i=head[now];i!=0;i=G[i].next){v = G[i].to;if(G[i].flow && dis[v]>dis[now]+G[i].cost){dis[v] = dis[now]+G[i].cost;if(vis[v]==0){vis[v] = 1,q.push(v);}}}}if(dis[T]<inf)return 1;return 0;
}
int Sech(int now, int low)
{int i, w, used;vis[now] = 1;if(now==T)return low;used = low;for(i=head[now];i!=0;i=G[i].next){if(G[i].flow && dis[G[i].to]==dis[now]+G[i].cost && vis[G[i].to]==0){w = Sech(G[i].to, min(used, G[i].flow));G[i].flow -= w;G[i^1].flow += w;used -= w;ans += w*G[i].cost;if(used==0)return low;}}return low-used;
}
int main(void)
{int i, j, n, m, u, v, len;while(scanf("%d%d", &n, &m)!=EOF){cnt = 1;S = 0, T = n+1;memset(head, -1, sizeof(head));memset(road, 62, sizeof(road));ans = 0;for(i=1;i<=n;i++){a[i] = Read(), b[i] = Read();c[i] = Read(), d[i] = Read();}for(i=1;i<=m;i++){u = Read(), v = Read(), len = Read();if(u==v)continue;road[u][v] = road[v][u] = min(road[u][v], len);}for(i=1;i<=n;i++){Add(S, i, b[i], a[i]);Add(i, S, 0, -a[i]);Add(i, T, d[i], -c[i]);Add(T, i, 0, c[i]);Add(i, T, b[i], -a[i]);Add(T, i, 0, a[i]);}for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(road[i][j]<=1000){Add(i, j, inf, road[i][j]);Add(j, i, 0, -road[i][j]);}}}while(SPFA()) {memset(vis, 0, sizeof(vis));while(Sech(S, inf))memset(vis, 0, sizeof(vis));}printf("%d\n", -ans);}return 0;
}
2017百度之星初赛:B-1005. 度度熊的交易计划(最小费用流)相关推荐
- 2017百度之星初赛:A-1006. 度度熊的01世界(DFS)
度度熊的01世界 Accepts: 967 Submissions: 3064 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...
- 2017百度之星资格赛:1003. 度度熊与邪恶大魔王
度度熊与邪恶大魔王 Accepts: 1288 Submissions: 7716 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 3 ...
- 2017百度之星资格赛:1001. 度度熊保护村庄(floyd最小环)
度度熊保护村庄 Accepts: 26 Submissions: 677 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/ ...
- 2017百度之星资格赛:1002. 度度熊的王国战略
度度熊的王国战略 Accepts: 69 Submissions: 2102 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
度度熊与邪恶大魔王 Time limit:1000 ms Memory limit:65536 kB Problem Description 度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来.邪恶大 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王
Problem:度度熊为了拯救可爱的公主,于是与邪恶大魔王战斗起来.邪恶大魔王的麾下有n个怪兽,每个怪兽有a[i]的生命值,以及b[i]的防御力.度度熊一共拥有m种攻击方式,第i种攻击方式,需要消耗k ...
- 2017百度之星初赛B场总结
(A场因为不可抗力因素(?)没能参加,B场还好算是磕磕碰碰地吃着低保过去了,真的菜呀) Chess Problem Description 車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋 ...
- 2017百度之星初赛:B-1006. 小小粉丝度度熊(贪心+尺取)
小小粉丝度度熊 Accepts: 1075 Submissions: 5191 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...
- 2017百度之星初赛
1001 小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32 ...
最新文章
- 想转行学python过来人提醒大家几点
- c++数学库 方法库 向量库等用法
- 各代程序设计语言拓扑
- 【深度学习】深入理解Batch Normalization批标准化
- 修改注册表添加信任站点及启用Activex控件(转载)
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
- Nginx基础数据结构分析-ngx_chain_t
- 动态规划---实现输出最大公共子序列的长度以及输出最大子字符串(java语言描述)
- mp4转换m3u8格式php,m3u8格式怎么转换mp4 ts格式转换 - 下载的m3u8、ts如何转换成mp4...
- 20000条笑话保证笑死你
- activemq启动错误:ERROR | Temporary Store limit is 51200 mb, whilst the temporary data directory
- Linux下Makefile的automake生成全攻略[zz]
- 多种好看好玩的词云例子Example
- java获取text plain_request中获取post的json对象数据content-type=“text/plain”
- 阿里云PAI平台模型压缩技术落地淘宝直播双十一应用:一猜到底
- Python 打包 exe 指南
- SNS社区网站的价格和价值
- 哪些星座的男生能把女朋友当成宝贝 ?
- android mock测试资源,Android测试教程 Mock之mockito,异步测试
- s7android系统电量,三星s7edge的6.0和7.0耗电量对比
热门文章
- 习题4-5 换硬币 (20分) 将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?
- 《微信思维》摘录(一)
- 思科网络学院-网络互联-第七章
- 卓有成效的程序员(影印版)
- 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系
- asp毕业设计——基于asp+access的在线人才招聘网设计与实现(毕业论文+程序源码)——人才招聘网
- 运维监控之HP存储监控及hp存储系列产品
- fb驱动安装linux系统,ubuntu16.04下NVIDIA GTX965M显卡驱动安装
- IBM ThinkPad 笔记本产品系列简介
- 系统分析与设计(一)