結果
問題 |
No.654 Air E869120
|
ユーザー |
|
提出日時 | 2025-05-20 17:50:52 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 11 ms / 2,000 ms |
コード長 | 2,719 bytes |
コンパイル時間 | 2,141 ms |
コンパイル使用メモリ | 201,332 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-05-20 17:50:56 |
合計ジャッジ時間 | 4,114 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 35 |
ソースコード
/* * Author: ttq012 * Date: 05/20/2025 */ #include <bits/stdc++.h> #define int long long using namespace std; const int N = 5010; const int mod = 1e9 + 7; const int inf = 1e18; struct Plane { int u, v, p, q, w; } pl[N]; namespace Flow { int S, T; struct Edge { int e, f, o; inline Edge(int a, int b) { e = a, f = b, o = 0; } } ; vector<Edge> adj[N]; int dep[N]; void ae(int a, int b, int c) { adj[a].push_back(Edge(b, c)); adj[b].push_back(Edge(a, 0)); int s1 = adj[a].size() - 1, s2 = adj[b].size() - 1; adj[a][s1].o = s2, adj[b][s2].o = s1; } int bfs() { queue<int> q; memset(dep, 0, sizeof dep); q.emplace(S); dep[S] = 1; while (q.size()) { int t = q.front(); q.pop(); for (int i = 0; i < adj[t].size(); ++i) { int r = adj[t][i].e, f = adj[t][i].f, o = adj[t][i].o; if (f && !dep[r]) { dep[r] = dep[t] + 1; q.emplace(r); if (r == T) return 1; } } } return 0; } int dfs(int p, int f) { if (p == T) return f; int s = 0; for (int i = 0; i < adj[p].size(); ++i) { if (!f) break; int q = adj[p][i].e, fx = adj[p][i].f; if (fx && dep[p] + 1 == dep[q]) { int delta = dfs(q, min(f, fx)); adj[p][i].f -= delta; adj[q][adj[p][i].o].f += delta; f -= delta; s += delta; } } return s ? s : (dep[p] = 0); } int dinic() { int s = 0; while (bfs()) s += dfs(S, inf); return s; } } signed main() { // freopen("travel.in", "r", stdin); // freopen("travel.out", "w", stdout); int n, m, d; cin >> n >> m >> d; for (int i = 1; i <= m; ++i) cin >> pl[i].u >> pl[i].v >> pl[i].p >> pl[i].q >> pl[i].w; Flow::S = N - 1, Flow::T = N - 2; for (int i = 1; i <= m; ++i) for (int j = 1; j <= m; ++j) if (i != j && pl[i].v == pl[j].u && pl[i].q + d <= pl[j].p) Flow::ae(i + m, j, inf); for (int i = 1; i <= m; ++i) Flow::ae(i, i + m, pl[i].w); for (int i = 1; i <= m; ++i) { if (pl[i].u == 1) Flow::ae(Flow::S, i, pl[i].w); if (pl[i].v == n) Flow::ae(i + m, Flow::T, pl[i].w); } cout << Flow::dinic() << '\n'; return 0; }