HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))
度度熊的交易计划
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1111 Accepted Submission(s): 403Problem 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]<=nOutput输出最多能赚多少钱。Sample Input2 1
5 5 6 1
3 5 7 7
1 2 1Sample Output23SourceRecommend
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=6118
题目大意:
N个城市,M条公路,每个城市花费a[i]元生产1个商品,但是最多生产b[i]个,以c[i]的价格出售最多d[i]个商品,每条公路每运送1个商品花费e[i],问最大收益
题目思路:
【最小费用最大流】
首先很容易想到是网络流问题,城市之间连得公路容量∞,费用为e[i],
源S到每个城市建一条容量b,费用a的边,每个城市到汇T建一条容量d费用-c的边
然后每个城市再向汇T连一条容量为b,费用为-a的边(等于不卖),这样就满足最大流性质。
然后跑一遍最小费用最大流即可。
- /****************************************************
- Author : Coolxxx
- Copyright 2017 by Coolxxx. All rights reserved.
- BLOG : http://blog.csdn.net/u010568270
- ****************************************************/
- #include<bits/stdc++.h>
- #pragma comment(linker,"/STACK:1024000000,1024000000")
- #define abs(a) ((a)>0?(a):(-(a)))
- #define lowbit(a) (a&(-a))
- #define sqr(a) ((a)*(a))
- #define mem(a,b) memset(a,b,sizeof(a))
- const double EPS=0.00001;
- const int J=;
- const int MOD=;
- const int MAX=0x7f7f7f7f;
- const double PI=3.14159265358979323;
- const int N=;
- const int M=;
- using namespace std;
- typedef long long LL;
- double anss;
- LL aans;
- int cas,cass;
- int n,m,lll,ans;
- struct xxx
- {
- int next,e,q,cost;
- }a[M];
- int last[N],d[N],hs[N];
- int S,T,nn;
- bool mark[N],K;
- void add(int x,int y,int z,int c)
- {
- a[++lll].next=last[x];
- last[x]=lll;
- a[lll].e=y;
- a[lll].q=z;
- a[lll].cost=c;
- }
- void build()
- {
- int i,j,k,x,y,z;
- S=n+,T=n+;
- nn=T;
- for(i=;i<=n;i++)
- {
- scanf("%d%d%d%d",&x,&y,&z,&k);
- add(S,i,y,x);
- add(i,S,,-x);
- add(i,T,y,-x);
- add(T,i,,x);
- add(i,T,k,-z);
- add(T,i,,z);
- }
- for(i=;i<=m;i++)
- {
- scanf("%d%d%d",&x,&y,&z);
- add(x,y,MAX,z);
- add(y,x,,-z);
- add(y,x,MAX,z);
- add(x,y,,-z);
- }
- }
- bool spfa()
- {
- int qq[M+M];
- int i,now,head,tail;
- //mem(mark,0);mem(d,0x7f);
- for(i=;i<=nn;i++)mark[i]=,d[i]=MAX;
- head=N;tail=N;
- qq[N]=S;
- d[S]=;mark[S]=;
- while(head<=tail)
- {
- now=qq[head];
- head++;
- for(i=last[now];i;i=a[i].next)
- {
- if(a[i].q> && d[now]+a[i].cost<d[a[i].e])
- {
- d[a[i].e]=d[now]+a[i].cost;
- if(!mark[a[i].e])
- {
- mark[a[i].e]=;
- if(d[a[i].e]<d[qq[head]])
- qq[--head]=a[i].e;
- else
- qq[++tail]=a[i].e;
- }
- }
- }
- mark[now]=;
- }
- if(d[T]==MAX)return ;
- else return ;
- }
- int dfs(int u,int f)
- {
- int v,i,tt,asp=;
- if(u==T)
- {
- K=;
- return f;
- }
- mark[u]=;
- for(i=last[u];i;i=a[i].next)
- {
- if(!mark[a[i].e] && a[i].q> && d[u]+a[i].cost==d[a[i].e])
- {
- tt=dfs(a[i].e,min(a[i].q,f-asp));
- a[i].q-=tt;
- a[i^].q+=tt;
- ans+=tt*a[i].cost;
- asp+=tt;
- if(asp==f)
- return f;
- }
- }
- return asp;
- }
- void mincostflow()
- {
- while()
- {
- if(!spfa())break;
- K=;
- while(K)
- {
- K=;
- mem(mark,);
- dfs(S,MAX);
- }
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("1.txt","r",stdin);
- // freopen("2.txt","w",stdout);
- #endif
- int i,j,k;
- int x,y,z;
- // for(scanf("%d",&cass);cass;cass--)
- // init();
- // for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
- while(~scanf("%d",&n))
- {
- scanf("%d",&m);
- mem(last,);
- lll=;ans=;
- build();
- mincostflow();
- cout<<-ans<<endl;
- }
- return ;
- }
- /*
- //
- //
- */
HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛 - 初赛(B))的更多相关文章
- HDU 6113 度度熊的01世界 【DFS】(2017"百度之星"程序设计大赛 - 初赛(A))
度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU 6118 度度熊的交易计划(最小费用最大流)
Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...
- HDU 6118 度度熊的交易计划 最大费用可行流
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:中文题 分析: 最小费用最大流,首先建立源点 s ,与超级汇点 t .因为生产一个商品需要 ...
- HDU 6109 数据分割 【并查集+set】 (2017"百度之星"程序设计大赛 - 初赛(A))
数据分割 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 6108 小C的倍数问题 【数学】 (2017"百度之星"程序设计大赛 - 初赛(A))
小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 2017"百度之星"程序设计大赛 - 初赛(B) 度度熊的交易计划 最小费用最大流求最大费用
/** 题目:度度熊的交易计划 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6118 题意:度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题 ...
- HDU 6118 度度熊的交易计划(费用流)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6118 [题目大意] 给出一张无向边权图,每个点最多可以生产b[i]商品,每件代价为a[i], 每个 ...
- 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 ...
随机推荐
- SPOJ GSS7 Can you answer these queries VII ——树链剖分 线段树
[题目分析] 问题放到了树上,直接链剖+线段树搞一搞. 调了300行+. (还是码力不够) [代码] #include <cstdio> #include <cstring> ...
- FZU 2186 小明的迷宫 【压状dp】
Problem Description 小明误入迷宫,塞翁失马焉知非福,原来在迷宫中还藏着一些财宝,小明想获得所有的财宝并离开迷宫.因为小明还是学生,还有家庭作业要做,所以他想尽快获得所有财宝并离开迷 ...
- 【bzoj2115】[Wc2011] Xor【高斯消元】
题目大意:给出一个无向有权图,找出一条从1到n的路径,使得路径上权值的异或和最大,路径可以重复走 Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条 ...
- BZOJ1924 [Sdoi2010]所驼门王的宝藏 【建图 + tarjan】
题目 输入格式 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti.Ti ...
- concurrentHashMap面试题
面试题: ConcurrentHashMap有哪些构造函数? ConcurrentHashMap使用什么技术来保证线程安全? ConcurrentHashMap的get方法是否要加锁,为什么? Con ...
- 费用流(bzoj 3130)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- 区间翻转(codevs 3243)
题目描述 Description 给出N个数,要求做M次区间翻转(如1 2 3 4变成4 3 2 1),求出最后的序列 输入描述 Input Description 第一行一个数N,下一行N个数表示原 ...
- 关于EOF,转自新浪微博
本文转自http://blog.sina.com.cn/s/blog_7714171f0101798y.html EOF 是 End Of File 的缩写. 在C语言中,它是在标准库中定义的一个宏. ...
- scanf printf函数返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); ...
- T1405 奶牛的旅行 codevs
http://codevs.cn/problem/1405/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 农民John的农场 ...