結果
問題 | No.654 Air E869120 |
ユーザー | merom686 |
提出日時 | 2018-02-24 00:34:17 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 9 ms / 2,000 ms |
コード長 | 3,217 bytes |
コンパイル時間 | 1,159 ms |
コンパイル使用メモリ | 94,380 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-10 11:03:03 |
合計ジャッジ時間 | 2,681 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 8 ms
5,248 KB |
testcase_11 | AC | 6 ms
5,248 KB |
testcase_12 | AC | 6 ms
5,248 KB |
testcase_13 | AC | 7 ms
5,248 KB |
testcase_14 | AC | 6 ms
5,248 KB |
testcase_15 | AC | 6 ms
5,248 KB |
testcase_16 | AC | 8 ms
5,248 KB |
testcase_17 | AC | 9 ms
5,248 KB |
testcase_18 | AC | 8 ms
5,248 KB |
testcase_19 | AC | 9 ms
5,248 KB |
testcase_20 | AC | 5 ms
5,248 KB |
testcase_21 | AC | 5 ms
5,248 KB |
testcase_22 | AC | 3 ms
5,248 KB |
testcase_23 | AC | 4 ms
5,248 KB |
testcase_24 | AC | 4 ms
5,248 KB |
testcase_25 | AC | 3 ms
5,248 KB |
testcase_26 | AC | 4 ms
5,248 KB |
testcase_27 | AC | 3 ms
5,248 KB |
testcase_28 | AC | 3 ms
5,248 KB |
testcase_29 | AC | 3 ms
5,248 KB |
testcase_30 | AC | 3 ms
5,248 KB |
testcase_31 | AC | 3 ms
5,248 KB |
testcase_32 | AC | 3 ms
5,248 KB |
testcase_33 | AC | 3 ms
5,248 KB |
testcase_34 | AC | 3 ms
5,248 KB |
testcase_35 | AC | 2 ms
5,248 KB |
testcase_36 | AC | 2 ms
5,248 KB |
testcase_37 | AC | 2 ms
5,248 KB |
testcase_38 | AC | 2 ms
5,248 KB |
testcase_39 | AC | 2 ms
5,248 KB |
ソースコード
#include <iostream> #include <vector> #include <string> #include <algorithm> #include <cstdio> #include <cstring> #include <cmath> using namespace std; struct Graph { static constexpr int64_t INF = (int64_t)1 << 60; struct Edge { int i, r; int64_t f; }; Graph(int n) : v(n), h(n), q(n), e(n) {} void add_edge(int i, int j, int64_t f) { int r0 = e[j].size(); int r1 = e[i].size(); e[i].push_back({ j, r0, max(+f, (int64_t)0) }); e[j].push_back({ i, r1, max(-f, (int64_t)0) }); } void bfs(int i0, int i1) { fill(v.begin(), v.end(), -1); v[i0] = 0; int j0 = 0, j1 = 0; q[j1++] = i0; while (j0 < j1) { int i = q[j0++]; for (Edge& o : e[i]) { if (v[o.i] >= 0 || o.f == 0) continue; v[o.i] = v[i] + 1; if (o.i == i1) return; q[j1++] = o.i; } } } int64_t dfs(int i, int i1, int64_t f0) { for (; h[i] < e[i].size(); h[i]++) { Edge& o = e[i][h[i]]; if (v[o.i] <= v[i] || o.f == 0) continue; int64_t f = min(f0, o.f); if (o.i != i1) f = dfs(o.i, i1, f); if (f == 0) continue; o.f -= f; e[o.i][o.r].f += f; return f; } return 0; } int64_t max_flow(int i0, int i1) { // i0 != i1 for (int64_t f = 0;;) { bfs(i0, i1); if (v[i1] < 0) return f; fill(h.begin(), h.end(), 0); while (1) { int64_t t = dfs(i0, i1, INF); if (t == 0) break; f += t; } } } vector<int> v, h, q; vector<vector<Edge>> e; }; void coco(vector<int>& v) { size_t n = v.size(); vector<pair<int, int>> t(n); for (int i = 0; i < n; i++) { t[i] = { v[i], i }; } sort(t.begin(), t.end()); int k = 0; for (int i = 0; i < n; i++) { if (i > 0 && t[i].first != t[i - 1].first) k++; v[t[i].second] = k; } } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, d; cin >> n >> m >> d; vector<int> u(m), v(m), w(m); vector<vector<int>> p(n); for (int i = 0; i < m; i++) { int p0, p1; cin >> u[i] >> v[i] >> p0 >> p1 >> w[i]; u[i]--; v[i]--; p1 += d; p[u[i]].push_back(p0); p[v[i]].push_back(p1); } vector<int> k(n + 1); for (int i = 0; i < n; i++) { if (p[i].empty()) continue; coco(p[i]); k[i + 1] = 1 + *max_element(p[i].begin(), p[i].end()); } for (int i = 0; i < n; i++) { k[i + 1] += k[i]; } Graph g(k[n]); for (int i = 0; i < n; i++) { for (int j = k[i]; j < k[i + 1] - 1; j++) { g.add_edge(j, j + 1, Graph::INF); } } vector<int> l(n); for (int i = 0; i < m; i++) { g.add_edge(k[u[i]] + p[u[i]][l[u[i]]++], k[v[i]] + p[v[i]][l[v[i]]++], w[i]); } if (k[1] - k[0] == 0 || k[n] - k[n - 1] == 0) { cout << 0 << endl; quick_exit(0); } cout << g.max_flow(0, k[n] - 1) << endl; return 0; }