hdu 6118 度度熊的交易计划(最小费用可行流)
来源:互联网 发布:2016年电信诈骗数据 编辑:程序博客网 时间:2024/04/28 03:02
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6118
思路:求最大值,取反成为求最小值。源点S,汇点T。
从源点向每一地区i连边,费用为a[i],流量为b[i](代表地区i每生产一物品花费)。
每一地区i向汇点连边,费用为-c[i],流量为d[i](代表地区i每卖出一物品所得)。
地区间两两连边,费用为地区间距离,流量为INF(代表每运送一物品花费)。
注意:若直接求则所求为最大流量条件下费用(此时利润不一定最大),所以当增广时发现费用为正时直接退出增广(此时继续增加流量导致费用变大,即继续增加导致最终利润减少)。
#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#define S 0#define T (n+1)#define debugusing namespace std;const int maxn=500+50;const int INF=0x3f3f3f3f;int n,m,ans;int gg[maxn][maxn];struct Edge{ int from,to,cap,flow,cost;};struct MCMF{ int n,m,s,t,flag; vector<Edge> edges; vector<int> G[maxn]; int inq[maxn],d[maxn]; int p[maxn],a[maxn]; void init(int n) { flag=0; this->n=n; for(int i=0; i<n; i++) G[i].clear(); edges.clear(); } void AddEdge(int from,int to,int cap,int cost) { edges.push_back((Edge){from,to,cap,0,cost}); edges.push_back((Edge){to,from,0,0,-cost}); m=edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BellmanFord(int s,int t,int &flow,int &cost) { for(int i=0; i<n; i++) d[i]=INF; memset(inq,0,sizeof(inq)); d[s]=0,inq[s]=1,p[s]=0,a[s]=INF; queue<int> Q; Q.push(s); while(!Q.empty()) { int u=Q.front(); Q.pop(),inq[u]=0; for(int i=0; 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); if(!inq[e.to]) { Q.push(e.to); inq[e.to]=1; } } } } if(d[t]==INF) return false; if(d[t]*a[t]>0) 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]^1].flow-=a[t]; u=edges[p[u]].from; } return true; } int Mincost(int s,int t) { int flow=0,cost=0; while(BellmanFord(s,t,flow,cost)); return cost; }};MCMF g;void init(){ for(int i=0; i<=n; i++) { for(int j=0; j<=n; j++) { gg[i][j]=INF; } } ans=INF; g.init(n+2);}int main(){#ifdef debu freopen("in.txt","r",stdin);#endif // debug while(scanf("%d%d",&n,&m)!=EOF) { init(); for(int i=1; i<=n; i++) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); g.AddEdge(S,i,b,a); g.AddEdge(i,T,d,-c); } for(int i=1; i<=m; i++) { int u,v,k; scanf("%d%d%d",&u,&v,&k); gg[u][v]=gg[v][u]=min(gg[u][v],k); } for(int i=1; i<=n; i++) { gg[i][i]=0; } for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(gg[i][j]<INF) { g.AddEdge(i,j,INF,gg[i][j]); } } } printf("%d\n",-g.Mincost(S,T)); } return 0;}
阅读全文
0 0
- HDU 6118 度度熊的交易计划 最小费用可行流
- HDU 6118 度度熊的交易计划(最小费用可行流\费用流)
- hdu 6118 度度熊的交易计划(最小费用可行流)
- HDU 6118 度度熊的交易计划(最小费用可行流)
- hdu 6118 度度熊的交易计划 (最小费用最大流
- HDU 6118 度度熊的交易计划 最小费用最大流
- 百度之星初赛B 度度熊的交易计划(最小费用可行流)
- HDU 6118 度度熊的交易计划 (最小费用最大流)
- HDU 6118 度度熊的交易计划(最小费用最大流模板)
- HDU 6118 度度熊的交易计划 (裸最小费用流)
- HDU 6118 度度熊的交易计划 (最小费用流变形)
- HDU6118-度度熊的交易计划(最小可行流)
- hdu 6118 度度熊的交易计划(费用流)
- 度度熊的交易计划 最小费用流
- HDU 6118 度度熊的交易计划 (最小费用最大流模板题)
- HDU 6118 度度熊的交易计划 【最小费用最大流】 (2017"百度之星"程序设计大赛
- hdu 6118 度度熊的交易计划(费用流)
- hdu 6118 度度熊的交易计划 费用流
- 5.1 SAP BW on HANA 数据建模特性
- 2017.8.14第一章
- P1540 机器翻译
- uva 1610 Party Games (贪心+STL字符串)
- jstl求list长度
- hdu 6118 度度熊的交易计划(最小费用可行流)
- java语言基础——java自带数组工具类Arrays
- luogu1038 神经网络
- maven多个web模块进行合并
- PHP学习笔记——php运行坏境的下载安装,php运行坏境的介绍(上)
- P1125 笨小猴 map
- idea常用设置(二) 【转自】请叫我大表哥
- 最简单,有效的学习mysql教程(一)
- 写给设计新人的小指导