【最小费用流】【模板】
2015-09-11 20:51
381 查看
int sumFlow; const int MAXN = 1010; const int MAXM = 1000200; const int INF = 1000000000; struct Edge { int u, v, cap, cost; int next; }edge[MAXM<<2]; int NE; int head[MAXN], dist[MAXN], pp[MAXN]; bool vis[MAXN]; void init() { NE = 0; memset(head, -1, sizeof(head)); } void addedge(int u, int v, int cap, int cost) { edge[NE].u = u; edge[NE].v = v; edge[NE].cap = cap; edge[NE].cost = cost; edge[NE].next = head[u]; head[u] = NE++; edge[NE].u = v; edge[NE].v = u; edge[NE].cap = 0; edge[NE].cost = -cost; edge[NE].next = head[v]; head[v] = NE++; } bool SPFA(int s, int t, int n) // <= { int i, u, v; queue <int> qu; memset(vis,false,sizeof(vis)); memset(pp,-1,sizeof(pp)); for(i = 0; i <= n; i++) dist[i] = INF; vis[s] = true; dist[s] = 0; qu.push(s); while(!qu.empty()) { u = qu.front(); qu.pop(); vis[u] = false; for(i = head[u]; i != -1; i = edge[i].next) { v = edge[i].v; if(edge[i].cap && dist[v] > dist[u] + edge[i].cost) { dist[v] = dist[u] + edge[i].cost; pp[v] = i; if(!vis[v]) { qu.push(v); vis[v] = true; } } } } if(dist[t] == INF) return false; return true; } int MCMF(int n,int s, int t) // minCostMaxFlow { int flow = 0; // 总流量 int i, minflow, mincost; mincost = 0; while(SPFA(s, t, n)) { minflow = INF + 1; for(i = pp[t]; i != -1; i = pp[edge[i].u]) if(edge[i].cap < minflow) minflow = edge[i].cap; flow += minflow; for(i = pp[t]; i != -1; i = pp[edge[i].u]) { edge[i].cap -= minflow; edge[i^1].cap += minflow; } mincost += dist[t] * minflow; } sumFlow = flow; // 最大流 return mincost; }
相关文章推荐
- HDU 1241 【搜索 水】
- Java心得31
- 屏幕适配——Drawable 资源
- 你所不知道的__ block 内幕
- IOS视图之UI基础
- navigationBar设置透明
- leetcode - Jump Game II
- proc-pid-mem
- 序列化二叉树
- R数组操作:截取大于x的所有数值
- linux 查找出包含某个字符串的所有文件的方法详解
- uva 10972 - RevolC FaeLoN(双联通)
- C/C++
- linux中压缩与解压缩大全 - linux中各种文件格式的解压缩
- POJ 1157 LITTLE SHOP OF FLOWERS (数塔_dp)
- HashSet 详解
- decision tree+percolation(笔记)+javaio
- UVa 225:Golygons(DFS)
- SDUT2937---人活着系列之寻找最完美的人生
- Linux中修改mysql的默认编码