度度熊的交易计划

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
———————————————————————————————————————————————
这道题是道很明显的网络流 建一波图就好了 注意是最小费用流不是最小费用最大流 当d【T】>=0时就没有必要继续跑下去了
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=,inf=0x3f3f3f3f;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>'') {if(c=='-') f=-; c=getchar();}
while(c>=''&&c<='') {ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,S,T,ans;
int first[M],cur[M],cnt,d[M],q[],vis[M];
struct node{int to,next,flow,cost;}e[];
void insert(int a,int b,int flow,int cost){
e[++cnt]=(node){b,first[a],flow,cost}; first[a]=cnt;
e[++cnt]=(node){a,first[b],,-cost}; first[b]=cnt;
}
int spfa(){
memset(d,0x3f,sizeof(d));
int head=,tail=;
q[]=S; d[S]=;
while(head!=tail){
int x=q[head++]; vis[x]=; if(head>) head=;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(e[i].flow&&d[now]>d[x]+e[i].cost){
d[now]=d[x]+e[i].cost;
if(!vis[now]){q[tail++]=now; vis[now]=; if(tail>) tail=;}
}
}
}
return d[T]<;
}
int dfs(int x,int a){
if(x==T||a==) return a;
vis[x]=;
int f,flow=;
for(int &i=cur[x];i;i=e[i].next){
int now=e[i].to;
if(!vis[now]&&d[now]==d[x]+e[i].cost&&(f=dfs(now,min(a,e[i].flow)))>){
e[i].flow-=f; e[i^].flow+=f;
flow+=f; ans+=e[i].cost*f;
a-=f; if(a==) break;
}
}
vis[x]=;
return flow;
}
int main()
{
int x,y,w;
while(scanf("%d %d",&n,&m)==){
memset(first,,sizeof(first));
ans=; cnt=;
S=; T=n+;
for(int i=;i<=n;i++){
x=read(); w=read(); insert(S,i,w,x);
x=read(); w=read(); insert(i,T,w,-x);
}
for(int i=;i<=m;i++){
x=read(); y=read(); w=read();
if(x==y) continue;
insert(x,y,inf,w);
insert(y,x,inf,w);
}
memset(vis,,sizeof(vis));
while(spfa()) {for(int i=S;i<=T;i++) cur[i]=first[i]; dfs(S,inf);}
printf("%d\n",-ans);
}
return ;
}

最新文章

  1. 【iCore3 双核心板_FPGA】实验二十一:Niosii——基于内部RAM建立第一个软核
  2. sql根据表名获取字段及对应说明
  3. Hadoop 安装(1) CENTOS 安装与配置
  4. 利用sass构建组件化的ui库
  5. AutoItLibrary安装报错(robotframework)解决
  6. JavaScript嗅探执行神器-sniffer.js,你值得拥有!
  7. android参数传递的几种方法
  8. BZOJ 3907: 网格 [Catalan数 高精度]
  9. Content-Type: application/www-form-urlencoded
  10. Linux中more和less命令用法
  11. 【MySql】常用方法总结
  12. Codeforces 977D: Divide by three, multiply by two(暴力)
  13. MarkDown常用语法及word转MarkDown
  14. Linux环境下FTP工具的使用方法
  15. C语言 &#183; 简单计算器
  16. HDU 1548 A strange lift(BFS)
  17. [GO]go context的deadline方法
  18. jQuery 遍历 - children() 方法 获取指定id下子元素的值
  19. LeetCode700. Search in a Binary Search Tree
  20. 孤荷凌寒自学python第八天 初识Python的序列之元组

热门文章

  1. C指针——简单总结
  2. python学习之循环语句
  3. mybatis在where中比较复杂的判断
  4. MySQL常用命令基础操作
  5. Too many parameters: expected 1, was given 2 Query: SELECT count(id) FROM `user` WHERE username = ?; Parameters: [org.apache.commons.dbutils.handlers.ScalarHandler@453da22c, [李明]]
  6. aspx页面 按钮不响应回车键
  7. Python locale 多语言模块和我遇到的坑
  8. WPF开发实例——仿QQ登录界面
  9. 3226: [Sdoi2008]校门外的区间
  10. echart搭配时间轴进行展示 (本例展示的是多时间 多地区 多指标条件 )