「学习笔记」费用流
费用流,和最大流的区别就是它的边权多了费用这个权值,一般是最小费用最大流,即在保证最大流的前提下做到费用最小
做法:贪心思想,按照费用来找出最短路,在所有的最短路上找增广路,直到没有增广路为止
ll spfa() {
for (int i = S; i <= T; ++ i) {
dis[i] = 1e18;
cur[i] = h[i];
}
deque<int> q;
q.push_back(S);
vis[S] = 1, dis[S] = 0;
while (!q.empty()) {
int u = q.front();
q.pop_front();
vis[u] = 0;
for (int i = h[u]; i; i = e[i].nxt) {
int v = e[i].v;
if (dis[v] > dis[u] + e[i].f && e[i].w) {
dis[v] = dis[u] + e[i].f;
if (!vis[v]) {
vis[v] = 1;
if (!q.empty() && dis[v] <= dis[q.front()]) {
q.push_front(v);
}
else {
q.push_back(v);
}
}
}
}
}
return dis[T] < 1e18;
}
ll dfs(int u, ll flow) {
if (u == T) {
return flow;
}
vis[u] = 1;
ll rest = flow, rlow = 0;
for (int &i = cur[u]; i && rest; i = e[i].nxt) {
int v = e[i].v;
if (dis[v] == dis[u] + e[i].f && !vis[v] && e[i].w) {
if ((rlow = dfs(v, min(rest, e[i].w)))) {
e[i].w -= rlow;
e[i ^ 1].w += rlow;
rest -= rlow;
cost += rlow * e[i].f;
}
}
}
vis[u] = 0;
return flow - rest;
}
while (spfa()) {
while (dfs(S, 1e18));
}
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17053227.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
朝气蓬勃 后生可畏
分类:
高级图论知识
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】