src/graph/nf/dinic/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../util/alias/others/lib.hpp" | ||
| 4 | |||
| 5 | namespace tifa_libs { | ||
| 6 | |||
| 7 | template <class T = u32> | ||
| 8 | class dinic { | ||
| 9 | struct TIFA { | ||
| 10 | u32 to; | ||
| 11 | T w; | ||
| 12 | u32 inv; | ||
| 13 | }; | ||
| 14 | cu32 n; | ||
| 15 | |||
| 16 | public: | ||
| 17 | vvec<TIFA> e; | ||
| 18 | vecu dep, cur; | ||
| 19 | |||
| 20 | 645 | CEXPE dinic(u32 n) NE : n{n}, e(n) {} | |
| 21 | |||
| 22 | 14084034 | CEXP pttu add(u32 u, u32 v, T w, T rw = 0) NE { | |
| 23 | 14084034 | cu32 lstu = (u32)e[u].size(), lstv = (u32)e[v].size(); | |
| 24 | 14084034 | e[u].push_back({v, w, lstv}), e[v].push_back({u, rw, lstu}); | |
| 25 | 14084034 | return {u, e[u].size() - 1}; | |
| 26 | } | ||
| 27 | template <class EW = u64> | ||
| 28 | 7604 | EW get(u32 s, u32 t) NE { | |
| 29 | 7604 | EW ret = 0, flow; | |
| 30 |
4/4unsigned long tifa_libs::dinic<unsigned int>::get<unsigned long>(unsigned int, unsigned int):
✓ Branch 1 taken 2525 times.
✓ Branch 2 taken 124 times.
unsigned long tifa_libs::dinic<unsigned long>::get<unsigned long>(unsigned int, unsigned int):
✓ Branch 1 taken 22616 times.
✓ Branch 2 taken 7480 times.
|
32745 | while (bfs(s, t)) |
| 31 |
4/4unsigned long tifa_libs::dinic<unsigned int>::get<unsigned long>(unsigned int, unsigned int):
✓ Branch 2 taken 2525 times.
✓ Branch 3 taken 2525 times.
unsigned long tifa_libs::dinic<unsigned long>::get<unsigned long>(unsigned int, unsigned int):
✓ Branch 2 taken 22616 times.
✓ Branch 3 taken 22616 times.
|
50282 | while ((flow = dfs<EW>(s, t))) ret += flow; |
| 32 | 7604 | return ret; | |
| 33 | } | ||
| 34 | |||
| 35 | private: | ||
| 36 | 32745 | bool bfs(u32 s, u32 t) NE { | |
| 37 | 32745 | dep = vecu(n, 0), dep[s] = 1; | |
| 38 | 65490 | std::queue<u32> q({s}); | |
| 39 |
4/4tifa_libs::dinic<unsigned int>::bfs(unsigned int, unsigned int):
✓ Branch 1 taken 397594993 times.
✓ Branch 2 taken 2649 times.
tifa_libs::dinic<unsigned long>::bfs(unsigned int, unsigned int):
✓ Branch 1 taken 2527615 times.
✓ Branch 2 taken 30096 times.
|
400155353 | while (!q.empty()) { |
| 40 | 400122608 | cu32 u = q.front(); | |
| 41 |
4/4tifa_libs::dinic<unsigned int>::bfs(unsigned int, unsigned int):
✓ Branch 7 taken 1772647295 times.
✓ Branch 8 taken 397594993 times.
tifa_libs::dinic<unsigned long>::bfs(unsigned int, unsigned int):
✓ Branch 7 taken 73930487 times.
✓ Branch 8 taken 2527615 times.
|
2246700390 | for (q.pop(); auto v : e[u]) |
| 42 |
12/12tifa_libs::dinic<unsigned int>::bfs(unsigned int, unsigned int):
✓ Branch 1 taken 851959055 times.
✓ Branch 2 taken 920688240 times.
✓ Branch 3 taken 397592344 times.
✓ Branch 4 taken 454366711 times.
✓ Branch 5 taken 397592344 times.
✓ Branch 6 taken 1375054951 times.
tifa_libs::dinic<unsigned long>::bfs(unsigned int, unsigned int):
✓ Branch 1 taken 3135949 times.
✓ Branch 2 taken 70794538 times.
✓ Branch 3 taken 2497519 times.
✓ Branch 4 taken 638430 times.
✓ Branch 5 taken 2497519 times.
✓ Branch 6 taken 71432968 times.
|
1846577782 | if (!dep[v.to] && v.w) dep[v.to] = dep[u] + 1, q.push(v.to); |
| 43 | } | ||
| 44 | 32745 | cur = vecu(n, 0); | |
| 45 | 32745 | return dep[t]; | |
| 46 | 32745 | } | |
| 47 | template <class EW> | ||
| 48 | 220213151 | CEXP EW dfs(u32 u, u32 t, T lim = std::numeric_limits<T>::max()) NE { | |
| 49 |
6/8unsigned long tifa_libs::dinic<unsigned int>::dfs<unsigned long>(unsigned int, unsigned int, unsigned int):
✓ Branch 0 taken 214779895 times.
✓ Branch 1 taken 2441021 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 214779895 times.
unsigned long tifa_libs::dinic<unsigned long>::dfs<unsigned long>(unsigned int, unsigned int, unsigned long):
✓ Branch 0 taken 2378011 times.
✓ Branch 1 taken 614224 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2378011 times.
|
220213151 | if (u == t || lim == 0) return (EW)lim; |
| 50 | 217157906 | EW ret = 0; | |
| 51 |
4/4unsigned long tifa_libs::dinic<unsigned int>::dfs<unsigned long>(unsigned int, unsigned int, unsigned int):
✓ Branch 3 taken 911891263 times.
✓ Branch 4 taken 206899666 times.
unsigned long tifa_libs::dinic<unsigned long>::dfs<unsigned long>(unsigned int, unsigned int, unsigned long):
✓ Branch 3 taken 53158949 times.
✓ Branch 4 taken 1783733 times.
|
1173733611 | for (u32& i = cur[u]; i < e[u].size(); ++i) |
| 52 |
12/12unsigned long tifa_libs::dinic<unsigned int>::dfs<unsigned long>(unsigned int, unsigned int, unsigned int):
✓ Branch 4 taken 226184570 times.
✓ Branch 5 taken 685706693 times.
✓ Branch 6 taken 217215866 times.
✓ Branch 7 taken 8968704 times.
✓ Branch 8 taken 217215866 times.
✓ Branch 9 taken 694675397 times.
unsigned long tifa_libs::dinic<unsigned long>::dfs<unsigned long>(unsigned int, unsigned int, unsigned long):
✓ Branch 4 taken 3024249 times.
✓ Branch 5 taken 50134700 times.
✓ Branch 6 taken 2947003 times.
✓ Branch 7 taken 77246 times.
✓ Branch 8 taken 2947003 times.
✓ Branch 9 taken 50211946 times.
|
965050212 | if (auto v = e[u][i]; dep[v.to] == dep[u] + 1 && v.w) { |
| 53 |
4/4unsigned long tifa_libs::dinic<unsigned int>::dfs<unsigned long>(unsigned int, unsigned int, unsigned int):
✓ Branch 2 taken 10322047 times.
✓ Branch 3 taken 206893819 times.
unsigned long tifa_libs::dinic<unsigned long>::dfs<unsigned long>(unsigned int, unsigned int, unsigned long):
✓ Branch 2 taken 1367010 times.
✓ Branch 3 taken 1579993 times.
|
220162869 | if (EW flow = dfs<EW>(v.to, t, min(v.w, lim)); flow) { |
| 54 |
4/4unsigned long tifa_libs::dinic<unsigned int>::dfs<unsigned long>(unsigned int, unsigned int, unsigned int):
✓ Branch 6 taken 7880229 times.
✓ Branch 7 taken 2441818 times.
unsigned long tifa_libs::dinic<unsigned long>::dfs<unsigned long>(unsigned int, unsigned int, unsigned long):
✓ Branch 6 taken 594278 times.
✓ Branch 7 taken 772732 times.
|
11689057 | if (e[u][i].w -= (T)flow, e[v.to][e[u][i].inv].w += (T)flow, ret += flow, lim -= (T)flow; !lim) break; |
| 55 | 208473812 | } else dep[v.to] = 0; | |
| 56 | } | ||
| 57 | 217157906 | return ret; | |
| 58 | } | ||
| 59 | }; | ||
| 60 | |||
| 61 | } // namespace tifa_libs | ||
| 62 |