您的位置:首页 > 其它

hdu 6118 度度熊的交易计划 费用流

2017-08-14 11:38 330 查看

度度熊的交易计划

Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 647 Accepted Submission(s): 226



Problem Description

度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:

喵哈哈村以及周围的村庄可以看做是一共由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


Source

2017"百度之星"程序设计大赛
- 初赛(B)

Recommend

liuyiding | We have carefully selected several similar problems for you: 6119 6118 6117 6116 6115

Statistic | Submit | Discuss | Note
题意略。

思路:裸的费用流。。。直接上模板,不过题目没要求最大流所以当增广路为非负时就要终止循环。代码如下:

#include<iostream>
#include<cmath>
#include<queue>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
#include<utility>
#include<set>
#include<map>
#include<stack>
#include<vector>
#define maxn 10005
#define inf 0x3f3f3f3f
using namespace std;
typedef long long LL;
const double eps = 1e-5;
const int mod = 998244353;
const int MAXN = 505;
const int MAXM = 100005;
const LL INF = 0x3f3f3f3f3f3f3f3f;
LL sum;
struct Edge
{
int to, next;
LL cap, flow, cost;
}edge[MAXM];
int head[MAXN], tol;
int pre[MAXN];
LL dis[MAXN];
bool vis[MAXN];
int N;
void init(int n)
{
N = n;
tol = 0;
memset(head, -1, sizeof(head));
}
void addedge(int u, int v, LL cap, LL cost)
{
edge[tol].to = v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = 0;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cap = 0;
edge[tol].cost = -cost;
edge[tol].flow = 0;
edge[tol].next = head[v];
head[v] = tol++;
}
bool spfa(int s, int t)
{
queue<int>q;
for (int i = 0; i <= N; i++)
{
dis[i] = INF;
vis[i] = false;
pre[i] = -1;
}
dis[s] = 0;
vis[s] = true;
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for (int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if (edge[i].cap > edge[i].flow &&
dis[v] > dis[u] + edge[i].cost)
{
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if (!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
if (pre[t] == -1)return false;
else return true;
}
LL minCostMaxflow(int s, int t, LL &cost)
{
LL flow = 0;
cost = 0;
while (spfa(s, t))
{
if (dis[t] >= 0)
break;
LL Min = INF;
for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1].to])
{
if (Min > edge[i].cap - edge[i].flow)
Min = edge[i].cap - edge[i].flow;
}
for (int i = pre[t]; i != -1; i = pre[edge[i ^ 1].to])
{
edge[i].flow += Min;
edge[i ^ 1].flow -= Min;
cost += edge[i].cost * Min;
}
flow += Min;
}
return flow;
}
int main(){
int n, m;
while (~scanf("%d%d", &n, &m)){
init(n + 1);
sum = 0;
for (int i = 1; i <= n; i++){
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
sum += b;
sum -= d;
addedge(0, i, b, a);
addedge(i, n + 1, d, -c);
}
while (m--){
int u, v, k;
scanf("%d%d%d", &u, &v, &k);
addedge(u, v, INF, k);
addedge(v, u, INF, k);
}
LL cost = 0;
minCostMaxflow(0, n + 1, cost);
printf("%lld\n", -cost);
}
}


度度熊的交易计划

Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 647 Accepted Submission(s): 226



Problem Description

度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题:

喵哈哈村以及周围的村庄可以看做是一共由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


Source

2017"百度之星"程序设计大赛
- 初赛(B)

Recommend

liuyiding | We have carefully selected several similar problems for you: 6119 6118 6117 6116 6115

Statistic | Submit | Discuss | Note
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: