最小费用流
来源:互联网 发布:申请淘宝店铺多少钱 编辑:程序博客网 时间:2024/05/23 01:19
#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;typedef pair<int,int> P;const int MAX_V=100+5;const int INF=0x3fffffff;struct edge{ int to,cap,cost,rev;};int V;vector<edge> G[MAX_V];int h[MAX_V];int dist[MAX_V];int prevv[MAX_V],preve[MAX_V];void init(){ for(int i=0;i<MAX_V;i++)G[i].clear();}void add_edge(int from,int to,int cap,int cost){ G[from].push_back((edge){to,cap,cost,G[to].size()}); G[to].push_back((edge){from,0,-cost,G[from].size()-1});}int min_cost_flow(int s,int t,int f){ int res=0; fill(h,h+V,0); while(f>0){ priority_queue<P,vector<P>,greater<P> >pq; fill(dist,dist+V,INF); //this line may be modified according to the problem dist[s]=0; pq.push(P(0,s)); while(!pq.empty()){ P p=pq.top();pq.pop(); int v=p.second; if(dist[v]<p.first)continue; for(int i=0;i<G[v].size();i++){ edge &e=G[v][i]; if(e.cap>0 && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){ dist[e.to]=dist[v]+e.cost+h[v]-h[e.to]; prevv[e.to]=v; preve[e.to]=i; pq.push(P(dist[e.to],e.to)); } } } if(dist[t]==INF){ return -1; } for(int v=0;v<V;v++)h[v]+=dist[v]; //this line may be modified according to the problem int d=f; for(int v=t;v!=s;v=prevv[v]){ d=min(d,G[prevv[v]][preve[v]].cap); } f-=d; res+=d*h[t]; for(int v=t;v!=s;v=prevv[v]){ edge &e=G[prevv[v]][preve[v]]; e.cap-=d; G[v][e.rev].cap+=d; } } return res;}
阅读全文
0 0
- 最小费用最小流uva10746
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用流模版
- 【最小费用最大流】
- 最小费用流
- 最小费用最大流
- 最小费用最大流
- Intervals----最小费用流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- 最小费用最大流
- hdu1853 最小费用流
- hdu1533 最小费用流
- hdu3667 最小费用流
- SQL查询和优化(十一)
- 关于编译错误--提领指向不完全类型的指针
- 主板开机电路
- hdu 6113 度度熊的01世界
- JavaScript Array的方法
- 最小费用流
- Python实现北邮人论坛模拟登录
- HDU6112今夕何夕(Java写法)
- linux apache
- Leetcode557. Reverse Words in a String III
- python可变参数和可改变对象
- application/x-www-form-urlencoded(AFNetwork 方式实现)
- netty拆包粘包问题处理
- 编程题