博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[洛谷P3381]【模板】最小费用最大流
阅读量:6465 次
发布时间:2019-06-23

本文共 1444 字,大约阅读时间需要 4 分钟。

题目大意:最小费用最大流

题解:最小费用最大流

卡点:1.太久不打MCMF,反向弧费用未取相反数

 

C++ Code:

#include 
#include
#define maxn 5010#define maxm 50100using namespace std;const int inf = 0x3f3f3f3f;int n, m, S, T, MF;int q[maxm], h, t;int d[maxn], pre[maxn];bool vis[maxn];int head[maxn], cnt = 2;struct Edge { int to, nxt, w, cost;} e[maxm << 1];void add(int a, int b, int c, int d) { e[cnt] = (Edge) {b, head[a], c, d}; head[a] = cnt; e[cnt ^ 1] = (Edge) {a, head[b], 0, -d}; head[b] = cnt ^ 1; cnt += 2;}inline int min(int a, int b) {return a < b ? a : b;}bool spfa() { memset(d, 0x3f, sizeof d); d[q[h = t = 0] = S] = 0; while (h <= t) { int u = q[h++]; vis[u] = false; for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].to; if (e[i].w && d[v] > d[u] + e[i].cost) { d[v] = d[u] + e[i].cost; pre[v] = i; if (!vis[v]) { q[++t] = v; vis[v] = true; } } } } return d[T] != inf;}int update() { int ans, mf = inf; for (int i = pre[T]; i; i = pre[e[i ^ 1].to]) mf = min(mf, e[i].w); ans = mf * d[T]; MF += mf; for (int i = pre[T]; i; i = pre[e[i ^ 1].to]) e[i].w -= mf, e[i ^ 1].w += mf; return ans;}void MCMF() { int ans = 0; while (spfa()) ans += update(); printf("%d %d\n", MF, ans);}int main() { scanf("%d%d%d%d", &n, &m, &S, &T); for (int i = 0; i < m; i++) { int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d); add(a, b, c, d); } MCMF(); return 0;}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9371954.html

你可能感兴趣的文章
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
NavigationController的使用
查看>>
多线程编程之Windows环境下创建新线程
查看>>
Unity3D NGUI 给button按钮添加单间事件
查看>>
密码的校验.大小写字母,数字,特殊字符中的至少3种
查看>>
ios 不同sdk4.3 6.0版本号,关于方法的兼容性的通用方法
查看>>
js滚动加载到底部
查看>>
Virtualbox 虚拟机网络不通
查看>>
memcache数据库和redis数据库的区别(理论)
查看>>
我的友情链接
查看>>
MyBatis+Spring结合
查看>>
Office 365之SkyDrive Pro
查看>>
Java Web 高性能开发
查看>>
初识Scala反射
查看>>
第三十九天
查看>>
Redis详解
查看>>
论程序员加班的害处
查看>>
codeblocks快捷键
查看>>
基于HTML5的WebGL设计汉诺塔3D游戏
查看>>
WPF资料链接
查看>>