HDU 6118 度度熊的交易计划(网络流-最小费用最大流)
喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区。
由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但是最多生产b[i]个。
同样的,由于每个片区的购买能力的区别,第i个片区也能够以c[i]的价格出售最多d[i]个物品。
由于这些因素,度度熊觉得只有合理的调动物品,才能获得最大的利益。
据测算,每一个商品运输1公里,将会花费1元。
那么喵哈哈村最多能够实现多少盈利呢?
Input本题包含若干组测试数据。
每组测试数据包含:
第一行两个整数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
Output输出最多能赚多少钱。
Sample Input
- 2 1
- 5 5 6 1
- 3 5 7 7
- 1 2 1
Sample Output
- 23
题解:
最小费用最大流,首先建立超级源点 s
,与超级汇点 t
。
因为生产一个商品需要花费 a[i]
元,且上限为 b[i]
,所以我们从 s
向这些点之间连一条容量为 b[i]
,费用为 -a[i]
的边。
同样的道理,出售一个商品可以赚到 c[i]
元,最多出售 d[i]
个,于是我们从这些点向 t
连一条容量为 d[i]
,费用为 c[i]
的边。
最后所有的公路也是花费,从 u
到 v
连接一条双向边,容量为 INF
,费用为 -k
,然后跑一边模板即可。
注意:图中存在自环,当我们得到两点路径长度小于 0 时应终止计算。
参考代码为
- #include<bits/stdc++.h>
- using namespace std;
- #define INF 0x3f3f3f3f
- typedef long long LL;
- const int M=;
- const int N=;
- struct edge
- {
- int to,cap,cost,nxt;
- } e[];
- int head[N],tot;
- int d[N], pre[N], path[N];
- bool vis[N];
- void init()
- {
- memset(head,-,sizeof(head));
- tot = ;
- }
- void addedge(int s, int t, int cap, int cost)
- {
- e[tot].to=t;
- e[tot].cap=cap;
- e[tot].cost=cost;
- e[tot].nxt=head[s];
- head[s] = tot++;
- e[tot].to=s;
- e[tot].cap=;
- e[tot].cost=-cost;
- e[tot].nxt=head[t];
- head[t] = tot++;
- }
- int spfa(int s, int t)
- {
- memset(d,-INF,sizeof(d));
- memset(pre,-,sizeof(pre));
- memset(path,-,sizeof(path));
- memset(vis,false,sizeof(vis));
- int res = d[];
- d[s] = ;
- vis[s] = true;
- queue<int>q;
- q.push(s);
- while (!q.empty())
- {
- int u = q.front();
- q.pop();
- vis[u] = false;
- for (int i = head[u]; ~i; i = e[i].nxt)
- {
- int v = e[i].to;
- if (d[v] < d[u] + e[i].cost && e[i].cap > )
- {
- d[v] = d[u] + e[i].cost;
- pre[v] = u;
- path[v] = i;
- if (!vis[v])
- {
- vis[v] = true;
- q.push(v);
- }
- }
- }
- }
- return d[t] != res;
- }
- int MinCostMaxFlow(int s, int t,int &cost)//返回最大流,cost为最小费用
- {
- int flow;
- flow=cost=;
- while (spfa(s, t))
- {
- int minn = INF;
- for(int i = t; i != s && ~i; i = pre[i]) minn = min(minn, e[path[i]].cap);
- for(int i = t; i != s && ~i; i = pre[i])
- {
- e[path[i]].cap -= minn;
- e[path[i] ^ ].cap += minn;
- }
- if(d[t]<) break; //由于可能会有自环
- flow += minn;
- cost += minn * d[t];
- }
- return flow;
- }
- int n,m;
- int main()
- {
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- init();
- int a,b,c,d;
- int st=,end=n+,cost;
- for(int i=;i<=n;i++)
- {
- scanf("%d%d%d%d",&a,&b,&c,&d);
- addedge(st,i,b,-a);
- addedge(i,end,d,c);
- }
- int u,v,k;
- while(m--)
- {
- scanf("%d%d%d",&u,&v,&k);
- addedge(u,v,INF,-k);
- addedge(v,u,INF,-k);
- }
- MinCostMaxFlow(st,end,cost);
- cout<<cost<<endl;
- }
- }
HDU 6118 度度熊的交易计划(网络流-最小费用最大流)的更多相关文章
- HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 6118度度熊的交易计划(费用流)
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 6118 度度熊的交易计划 (最小费用流)
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- hdu 6118 度度熊的交易计划
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 6118 度度熊的交易计划 最大费用可行流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...
- HDU 6118 度度熊的交易计划(最小费用最大流)
Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...
- HDU 6118 度度熊的交易计划(费用流)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6118 [题目大意] 给出一张无向边权图,每个点最多可以生产b[i]商品,每件代价为a[i], 每个 ...
- HDU 6118 2017百度之星初赛B 度度熊的交易计划(费用流)
度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 2017"百度之星"程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用
/** 题目:度度熊的交易计划 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题 ...
随机推荐
- Python 基础之socket编程(三)
python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...
- 三张关联表,大表;单次查询耗时400s,有group by order by 如何优化
问题SQL: select p.person_id as personId, p.person_name as personName, p.native_place as nativePlace, c ...
- PHP Laravel5实现的RBAC权限管理操作示例
根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发.下面请认真学习一下laravel的RBAC设计 1.建表(用户表.角色表.权限表. ...
- 如何基于k8s快速搭建TeamCity(YAML分享)
前言 最近有朋友基于之前的博客<Docker最全教程之使用TeamCity来完成内部CI.CD流程(十七)>搭建TeamCity时出现了一些问题,由于平常比较忙,没有及时答复,非常抱歉. ...
- Verilog模块概念和实例化#转载自Jason from Lofter
Verilog模块概念和实例化 模块的概念 模块(module)是verilog最基本的概念,是v设计中的基本单元,每个v设计的系统中都由若干module组成. 1.模块在语言形式上是以关键词modu ...
- fastjason常用方法
背景 fastjson爆出重大漏洞,攻击者可使整个业务瘫痪 漏洞描述 常用JSON组件FastJson存在远程代码执行漏洞,攻击者可通过精心构建的json报文对目标服务器执行任意命令,从而获得服务器权 ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由和HTTP方法
ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把 ...
- android 网络异步加载数据进度条
ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...
- websrom编译器
webstorm less环境配置 备注: 安装node后,在命令行输入npm install -g less 即可安装less,打开webstorm setting-Tools-FileWatche ...
- socket解决编码解码问题
MySocket类: import socket class MySocket(socket.socket): # 继承自socket文件中的socket类,此时socket就是父类 def __in ...