hdu 6118 度度熊的交易计划
度度熊的交易计划
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 993 Accepted Submission(s):
360
喵哈哈村以及周围的村庄可以看做是一共由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
5 5 6 1
3 5 7 7
1 2 1

这个时候最好的路径选择应该是:s->1->3->t, s->2->4->t 两条,利润为10。但是如果程序一开始选择了路径s->1->4->t 呢,这也是当前的一条最短路径,这时要是没有黄线,下一次从s->2之后无路可走了,利润就变成5了。。。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
#include<algorithm>
#include<queue>
#include<set>
#include<vector>
#include<cstring>
#include<string>
#include<functional>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
const int N_MAX = + , V_MAX = + ; struct Edge
{
int from, to, cap, flow, cost;
Edge(int u, int v, int ca, int f, int co) :from(u), to(v), cap(ca), flow(f), cost(co) {};
}; struct MCMF
{
int n, m, s, t;
vector<Edge> edges;
vector<int> G[V_MAX];
int inq[V_MAX];//是否在队列中
int d[V_MAX];//距离
int p[V_MAX];//上一条弧
int a[V_MAX];//可改进量 void init(int n)//初始化
{
this->n = n;
for (int i = ; i<n; i++)
G[i].clear();
edges.clear();
} void add_edge(int from, int to, int cap, int cost)//加边
{
edges.push_back(Edge(from, to, cap, , cost));
edges.push_back(Edge(to, from, , , -cost));
int m = edges.size();
G[from].push_back(m - );
G[to].push_back(m - );
} bool SPFA(int s, int t, int &flow, int &cost)//寻找最小费用的增广路,使用引用同时修改原flow,cost
{
for (int i = ; i<n; i++)
d[i] = INF;
memset(inq, , sizeof(inq));
d[s] = ; inq[s] = ; p[s] = ; a[s] = INF;
queue<int> Q;
Q.push(s);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
inq[u]--;
for (int i = ; i<G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if (e.cap>e.flow && d[e.to]>d[u] + e.cost)//满足可增广且可变短
{
d[e.to] = d[u] + e.cost;
p[e.to] = G[u][i];
a[e.to] = min(a[u], e.cap - e.flow);//e.flow是这条边已经用掉了的流量
if (!inq[e.to])
{
inq[e.to]++;
Q.push(e.to);
}
}
}
}
if (d[t] == INF) return false;//汇点不可达则退出
flow += a[t];
cost += d[t] * a[t];
int u = t;
while (u != s)//更新正向边和反向边
{
edges[p[u]].flow += a[t];
edges[p[u] ^ ].flow -= a[t];
u = edges[p[u]].from;
}
return true;
} int MincotMaxflow(int s, int t)
{
int flow = , cost = ;
while (SPFA(s, t, flow, cost));
return cost;
}
}; int n, m;
int a[N_MAX], b[N_MAX], c[N_MAX], D[N_MAX];
int d[N_MAX][N_MAX]; void floyd() {
for (int k = ; k <= n; k++)
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
} int main() { while (scanf("%d%d",&n,&m)!=EOF) {
memset(d,INF,sizeof(d));
for (int i = ; i <= n; i++)d[i][i] = ;
int s = , t =* n + ;
int V = t + ;
MCMF mcmf;
mcmf.init(V);
//1~n:生产点
//n+1~2n:出售点 for (int i = ; i <= n;i++) {
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&D[i]);
mcmf.add_edge(s,i,b[i],);//最多生产b[i]个
mcmf.add_edge(i+n,t,D[i],);//最多出售D[i]个
}
for (int i = ; i <= m;i++) {
int u, v, w;
scanf("%d%d%d",&u,&v,&w);
if (u == v)continue;//!!!!!!自环
d[u][v] = min(d[u][v],w);//!!!!重边
d[v][u] = min(d[v][u], w);
}
floyd();
for (int i = ; i <= n;i++) {
for (int j = ; j <= n;j++) {
if (d[i][j] == INF)continue;
int profit= c[j] - a[i] - d[i][j];
if (profit > ) {
mcmf.add_edge(i, j + n, INF, -profit);
}
}
mcmf.add_edge(i,t,b[i],);//!!
}
printf("%d\n",-mcmf.MincotMaxflow(s,t));
} return ;
}
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 度度熊的交易计划(最小费用最大流)
Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...
- HDU 6118 度度熊的交易计划(网络流-最小费用最大流)
度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个商品,但 ...
- HDU 6118 度度熊的交易计划(费用流)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6118 [题目大意] 给出一张无向边权图,每个点最多可以生产b[i]商品,每件代价为a[i], 每个 ...
- HDU 6118 度度熊的交易计划 最大费用可行流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...
- 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 题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题 ...
随机推荐
- SizeClass介绍
随着iOS8系统的发布,一个全新的页面UI布局概念出现,这个新特性将颠覆包括iOS7及之前版本的UI布局方式,这个新特性就是Size Class.Size Class配合Auto Layout可以解决 ...
- Xcode开发技巧
1.Xcode 中的 Code Snippets 默认放在下面的目录中: ~/Library/Developer/Xcode/UserData/CodeSnippets 2.自定义的代码背景颜色和代码 ...
- 重温经典之赫夫曼(Huffman)编码
先看看赫夫曼树假设有n个权值{w1,w2,…,wn},构造一个有n个叶子结点的二叉树,每个叶子结点权值为wi,则其中带权路径长度WPL最小的二叉树称作赫夫曼树或最优二叉树. 赫夫曼树的构造,赫夫曼最早 ...
- deque 用法
引用博客:https://blog.csdn.net/zyq522376829/article/details/46801973 下面是那位大佬写的的笔记整理~~~~ deque - 双向队列 1.构 ...
- C语言中sizeof的用法
今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...
- 如何使用postman做接口测试
1.get请求传参 只要是get请求都可以在浏览器中直接发: 在访问地址后面拼 ?key=value&key=value 例如: 在浏览器中直接输入访问地址,后面直接拼需要传给服务器的参数 ...
- 日志切割logrotate和定时任务crontab详解
1.关于日志切割 日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到.对于忙碌的服务器,日志文件大小会增长极快,服务器会很快消耗磁盘空间,这成了个问题.除此之外,处 ...
- 【laravel】【转发】laravel 导入导出excel文档
1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出 ...
- Decorator——Python初级函数装饰器
最近想整一整数据分析,在看一本关于数据分析的书中提到了(1)if __name__ == '__main__' (2)列表解析式 (3)装饰器. 先简单描述一下前两点,再详细解说Python初级的函数 ...
- GoF23种设计模式之结构型模式之代理模式
一.概述 为其他对象提供一种代理以控制对这个对象的访问. 二.适用性 1.远程代理(RemoteProxy):为一个对象在不同的地址空间土工局部代表. 2.虚代理(VirtualProxy):根据需要 ...