最小费用最大流模板
来源:互联网 发布:ubuntu 无法启动虚拟机 编辑:程序博客网 时间:2024/06/05 04:21
BellmanFord 沿最短路增广
注意网络中不能有负权圈 但是存在负权的边是可以的
#include<stdio.h>#include<iostream>#include<string.h>#include<vector>#include<queue>#include<algorithm>using namespace std;#define maxn 1005#define inf 0xfffffstruct Edge{ int from,to,cap,flow; int cost;};struct MCMF{ int n,m,s,t; vector<Edge> edges; vector<int> G[maxn]; int inq[maxn]; int d[maxn]; int p[maxn]; int a[maxn]; void init(int n) { for(int i=0;i<n;++i) { G[i].clear(); } edges.clear(); } void AddEdge(int from,int to,int cap,int flow,int cost) { edges.push_back((Edge){from,to,cap,0,cost}); edges.push_back((Edge){to,from,0,0,-cost}); m = (int )edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BF(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;} 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(BF(s,t,flow,cost)); return cost; }};int main(){ MCMF mc; scanf("%d",&mc.n); mc.AddEdge(0,1,2,3,4); printf("%d\n",mc.Mincost(0,1));}
0 0
- 模板[最小费用最大流]
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流,模板
- 最小费用最大流模板
- 最小费用最大流 模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- BTrace使用总结
- Fibonacci数列
- CodeForces Round 230 Div2 D
- 如何让PCB中的元器件以任意角度旋转?
- 利用GPGPU方法将大量数据通过纹理传输至GPU进行计算
- 最小费用最大流模板
- Oracle下载地址
- struts2环境配置
- 如何优雅地终止正在运行的子线程
- CSS浮动(float,clear)通俗讲解
- Oracle安装简单过程
- 单硬盘MBR分区双系统引导解决方法
- 命名管道详解
- 负整数的整除与取余运算