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

喵哈哈村以及周围的村庄可以看做是一共由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 度度熊的交易计划(网络流-最小费用最大流)的更多相关文章

  1. HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. hdu 6118度度熊的交易计划(费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU 6118 度度熊的交易计划 (最小费用流)

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. hdu 6118 度度熊的交易计划

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...

  6. HDU 6118 度度熊的交易计划(最小费用最大流)

    Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...

  7. HDU 6118 度度熊的交易计划(费用流)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6118 [题目大意] 给出一张无向边权图,每个点最多可以生产b[i]商品,每件代价为a[i], 每个 ...

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

    度度熊的交易计划 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 2017"百度之星"程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用

    /** 题目:度度熊的交易计划 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题 ...

随机推荐

  1. SpringBoot 整合jdbc和mybatis

    摘要 该文章主要为记录如何在SpringBoot项目中整合JDBC和MyBatis,在整合中我会使用简单的用法和测试用例,毕竟该文章目的是为了整合,而不是教大家如何去使用.希望大家多多包涵. 通用配置 ...

  2. 更改微信小程序的组件默认样式

    checkbox /*checkbox 整体大小  */ .checkbox {      width: 12%;      /* height: 240rpx; */ } /*checkbox 选项 ...

  3. pandas的使用(3)

    pandas的使用(3)

  4. 领扣(LeetCode)删除注释 个人题解

    给一个 C++ 程序,删除程序中的注释.这个程序source是一个数组,其中source[i]表示第i行源码. 这表示每行源码由\n分隔. 在 C++ 中有两种注释风格,行内注释和块注释. 字符串// ...

  5. 用例图浅谈以及OOA再到情景分析的面向对象电梯的设计(慕课东北大学)面向对象设计思维模式

    上班初期还不太适应,平时学习进度也跟不上,节奏慢下来会有时间更新的了. Diagram  这边以学生课程报名系统为例    这就是一种简单的用例图 用例图可以给读者提供的信息非常丰富,但是缺点是都是概 ...

  6. htm&css 颜色的浮动

    目标样式 目标分析: 由图可知,整个色板可以分为三块 可以理解为一个大的盒子包含了三个小的盒子,定义如下 LEFT的定义方式 TOP的定义方式 class为bottom的块最为复杂,但分析方法也是异曲 ...

  7. PL真有意思(六):子程序和控制抽象

    前言 在之前我们把抽象定义为一种过程,程序员可以通过它将一个名字与一段可能很复杂的程序片段关联起来.抽象最大的意义就在于,我们可以从功能和用途的角度来考虑它,而不是实现. 在大多数程序设计语言中,子程 ...

  8. java8 Optional优雅非空判断

    java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...

  9. Dart Learn Notes 02

    Functions Dart是一门面向对象的语言,所以即便是方法也是一个对象,它的类型是Function. 这就意味着方法可以指向变量,也可以作为方法中的参数供其他方法使用.甚至可以让 一个类作为一个 ...

  10. win10 下安装zookeeper+Kafka 的详细步骤(2)

    Win10 下要使用Kafka需要经过以下三个步骤: 1.安装JDK(需要安装依赖java JDK) 2.安装zookeeper(资源协调,分配管理) 3.使用Kafka开发 ============ ...