最小费用最大流模板
来源:互联网 发布:mysql 多条select语句 编辑:程序博客网 时间:2024/06/05 03:09
const int MAXN = 1010;const int MAXM = 504000;struct Edge{ int to,next,cap,flow,cost;}edge[MAXM];int head[MAXM],tol;int pre[MAXN],dis[MAXN];bool vis[MAXN];int N;void Init(int n){ N = n; tol = 0; memset(head,-1,sizeof(head));}void addedge(int u,int v,int cap,int cost){ edge[tol].to = v; edge[tol].cap = cap; edge[tol].cost = cost; edge[tol].flow = 0; edge[tol].next = head[u]; head[u] = tol++; edge[tol].to = u; edge[tol].cap = 0; edge[tol].cost = -cost; edge[tol].flow = 0; edge[tol].next = head[v]; head[v] = tol++;}bool spfa(int s,int t){ queue<int> q; for(int i = 0;i < N; ++i) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(q.empty() == false) { int u = q.front(); q.pop(); vis[u] = false; for(int i = head[u];i != -1;i = edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(vis[v] == false) { vis[v] = true; q.push(v); } } } } if(pre[t] == -1) return false; return true;}int MCMF(int s,int t,int &cost){ int flow = 0; cost = 0; while(spfa(s,t)) { int Min = INF; for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) Min = min(Min,edge[i].cap - edge[i].flow); for(int i = pre[t];i != -1;i = pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost*Min; } flow += Min; } return flow;}
0 0
- 模板[最小费用最大流]
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流,模板
- 最小费用最大流模板
- 最小费用最大流 模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- 最小费用最大流模板
- UINavigationController
- 算法导论笔记:07快速排序
- SCOI2015小记
- 2013年度最强AngularJS资源合集
- LeetCode 26 Remove Duplicates from Sorted Array
- 最小费用最大流模板
- B/S和C/S的区别
- StackOverflowError
- SDUST SingleTest B(15.4.3)
- Android SlidingMenu源码初步分析,实现大致滑动效果
- 4.17
- Java反射
- XML中RelativeLayout的参数
- 结构体排序