首页 > 其他分享 >Dinic(最大流/最小割+费用流)

Dinic(最大流/最小割+费用流)

时间:2022-11-11 13:45:22浏览次数:44  
标签:tmp 费用 return val int ll 最小 rest Dinic

最大流/最小割:

 1 typedef long long ll;
 2 const int N = 1e4 + 5;
 3 const int M = 2e5 + 5;
 4 const ll inf = 1e18;
 5 int n, m, s, t, tot;
 6 ll head[N], to[M], nxt[M], val[M], d[N];
 7 inline void link(int u, int v, ll w) // link
 8 {
 9     to[tot] = v;
10     nxt[tot] = head[u];
11     val[tot] = w;
12     head[u] = tot++;
13 }
14 inline void add(int u, int v, ll w) // 加边
15 {
16     link(u, v, w);
17     link(v, u, 0);
18 }
19 queue<int> q;
20 inline bool bfs() // 分层
21 {
22     q = queue<int>();
23     memset(d, 0, sizeof(d));
24     d[s] = 1;
25     q.emplace(s);
26     while (!q.empty())
27     {
28         int tmp = q.front();
29         q.pop();
30         for (int i = head[tmp]; ~i; i = nxt[i])
31             if (!d[to[i]] && val[i])
32             {
33                 d[to[i]] = d[tmp] + 1;
34                 q.emplace(to[i]);
35                 if (to[i] == t)
36                     return true;
37             }
38     }
39     return false;
40 }
41 inline ll dfs(ll x, ll flow) // 求解
42 {
43     if (x == t)
44         return flow;
45     ll rest = flow;
46     for (int i = head[x]; ~i; i = nxt[i])
47         if (d[to[i]] == d[x] + 1 && val[i])
48         {
49             ll t = dfs(to[i], min(rest, val[i]));
50             if (!t)
51                 d[to[i]] = 0;
52             rest -= t;
53             val[i] -= t;
54             val[i ^ 1] += t;
55         }
56     return flow - rest;
57 }
58 inline ll Dinic()
59 {
60     ll res = 0;
61     while (bfs())
62         res += dfs(s, inf);
63     return res;
64 }
View Code

费用流:

 1 typedef long long ll;
 2 const int N = 5e3 + 5;
 3 const int M = 5e4 + 5;
 4 const ll inf = 0x3f3f3f3f3f3f3f3f;
 5 int n, m, s, t, tot;
 6 ll head[N], to[M << 1], nxt[M << 1], val[M << 1], c[M << 1], d[N], flw, cst;
 7 bool vis[N];
 8 inline void link(int u, int v, ll w, ll cost)
 9 {
10     to[tot] = v;
11     nxt[tot] = head[u];
12     val[tot] = w;
13     c[tot] = cost;
14     head[u] = tot++;
15 }
16 inline void add(int u, int v, ll w, ll cost)
17 {
18     link(u, v, w, cost);
19     link(v, u, 0, -cost);
20 }
21 queue<int> q;
22 inline bool spfa()
23 {
24     memset(d, 0x3f, sizeof(d));
25     q.emplace(s);
26     d[s] = 0;
27     vis[s] = true;
28     while (!q.empty())
29     {
30         int tmp = q.front();
31         q.pop();
32         vis[tmp] = false;
33         for (int i = head[tmp]; ~i; i = nxt[i])
34             if (val[i] && d[to[i]] > d[tmp] + c[i])
35             {
36                 d[to[i]] = d[tmp] + c[i];
37                 if (!vis[to[i]])
38                 {
39                     vis[to[i]] = true;
40                     q.emplace(to[i]);
41                 }
42             }
43     }
44     return d[t] != inf;
45 }
46 inline ll dfs(ll x, ll flow)
47 {
48     if (x == t)
49         return flow;
50     vis[x] = true;
51     ll rest = flow;
52     for (int i = head[x]; ~i; i = nxt[i])
53         if (!vis[to[i]] && val[i] && d[to[i]] == d[x] + c[i])
54         {
55             ll t = dfs(to[i], min(rest, val[i]));
56             if (!t)
57                 d[to[i]] = 0;
58             rest -= t;
59             val[i] -= t;
60             val[i ^ 1] += t;
61             cst += t * c[i];
62         }
63     vis[x] = false;
64     return flow - rest;
65 }
66 inline void MCMF()
67 {
68     while (spfa())
69         flw += dfs(s, inf);
70     cout << flw << ' ' << cst;
71 }
View Code

 

标签:tmp,费用,return,val,int,ll,最小,rest,Dinic
From: https://www.cnblogs.com/creation-hy/p/Dinic.html

相关文章

  • 最小装载(二分法)字符串
    1011.在D天内送达包裹的能力左值为数组中最大的元素(最少要能把它装下);右值为数组元素之和;while(left<right){intmid=(right+left)/2;intneed=1,cur=......
  • 洛谷 P4423 [BJWC2011]最小三角形 题解
    求平面最近点对的时候有这样一种思路:将所有点全部绕原点旋转同一个角度,然后按横坐标排序。根据数学直觉,在随机旋转后,答案中的两个点在数组中肯定不会离得太远。把这种......
  • 76.最小覆盖子串
    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:对于 t 中......
  • Matlab最小二乘法:线性最小二乘、加权线性最小二乘、稳健最小二乘、非线性最小二乘与剔
    ​​matlab​​软件在拟合数据时使用最小二乘法。拟合需要一个参数模型,该模型将因变量数据与具有一个或多个系数的预测数据相关联。拟合过程的结果是模型系数的估计。为了获......
  • HCIE有没有必要重认证?hcie重认证费用是多少?
    HCIE重认证规则HCIE系列认证是华为职业认证中用于标识个人能力在某一技术领域达到专家级别的证明。HCIE证书的有效期是两年,重认证之后的有效期是两年。详细了解华为认证重......
  • 力扣209 长度最小的子数组
    题目:给定一个含有 n 个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组 [numsl,numsl+1,...,numsr-1,numsr],并返回......
  • 制作最小linux内核(1)
       ​​深入理解Linux2.6的initramfs機制(上)​​ 一文提到了制作简易initramfs的过程;而另一篇文章​​使用udevadm(modinfo)查找linux下设备对应的驱动​​ ......
  • windows平台下软件最小化后无法打开的解决方法
       今天打开电脑后,双击桌面软件图标,软件启动画面出现,等了几秒后直接最小化窗口,感觉有点奇怪。点击任务栏图标后没有反应,软件界面没出现。以为软件是不是安装破损什么......
  • 输入框设置最大值和最小值
    <el-form-itemlabel="开始积分"prop="startScore"><el-inputtype="number"max="5"min="0"@input="numberChange(arguments[0],5)"@change="numberChange(argument......
  • 数据机构 最小生成树(Prim算法(普里姆、Kruskal算法( 克鲁斯卡尔))
    8.8、最小生成树连通图的生成树是包含图中全部顶点的一个极小连通子图;若图中顶点数为n,则它的生成树含有\(n-1\)条边。最小生成树对于一个带权连通无向图G=(V,E),生成树......