标签:cos size 时间 表示 没有 分层图 时间复杂度 while class
边们增加了费用 求费用最少的最大流
在残余网络中,用spfa跑费用的最短路,然后沿着这条花费最少的增广路进行增广
(表示怀疑这样做的时间复杂度会比较高 因为他甚至都没有沿着分层图上最短路去增广...不过貌似没有别的办法...)
ans表示费用
bool spfa(int st, int ed){ queue<int>Q; memset(pre, -1, sizeof pre); memset(inq, 0, sizeof inq); memset(d, inf, sizeof d); inq[st] = 1; d[st] = 0; Q.push(st); while(!Q.empty()){ int u = Q.front(); Q.pop(); inq[u] = 0; for(int i = head[u]; ~i; i = edge[i].nxt){ int v = edge[i].v, cost = edge[i].cost; if(d[v] > d[u]+cost && edge[i].w-edge[i].f){ d[v] = d[u]+cost; pre[v] = i; if(!inq[v]){ inq[v] = 1; Q.push(v); } } } } return pre[ed] != -1; } int MCMF(int st, int ed){ int flow = 0; ans = 0; while(spfa(st, ed)){ int MIN = inf; for(int i = pre[ed]; ~i; i = pre[edge[i^1].v]){ if(MIN > edge[i].w-edge[i].f) MIN = edge[i].w-edge[i].f; } for(int i = pre[ed]; ~i; i = pre[edge[i^1].v]){ edge[i].f += MIN; edge[i^1].f -= MIN; } ans += d[ed]*MIN; flow += MIN; } return flow; }
标签:cos size 时间 表示 没有 分层图 时间复杂度 while class
原文地址:http://www.cnblogs.com/DearDongchen/p/7624325.html