結果
問題 |
No.654 Air E869120
|
ユーザー |
![]() |
提出日時 | 2025-05-18 20:41:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 10 ms / 2,000 ms |
コード長 | 1,999 bytes |
コンパイル時間 | 1,923 ms |
コンパイル使用メモリ | 201,628 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-05-18 20:41:54 |
合計ジャッジ時間 | 3,636 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 1e4 + 5, M = 4e6 + 5; const ll INF = 0x3f3f3f3f3f3f3f3f; ll n, m, k, S, T; struct Airline { ll u, v, p, q, w; } edges[N]; struct Edge { ll to, val, rev; Edge(ll t = 0, ll v = 0, ll r = 0) { to = t, val = v, rev = r; } }; vector<Edge> e[N]; ll dist[N]; ll cur[N]; //????? bool bfs(ll s, ll t) { queue<ll> q; for (ll i = s; i <= t; i++) dist[i] = -1; q.push(s); dist[s] = 0; while (!q.empty()) { ll h = q.front(); q.pop(); for (auto i: e[h]) if (i.val > 0 && dist[i.to] == -1) { dist[i.to] = dist[h] + 1; q.push(i.to); } } return dist[t] != -1; } ll dfs(ll x, ll f, ll t) { if (x == t || f == 0) return f; for (ll i = cur[x]; i < e[x].size(); i = ++cur[x]) { if (e[x][i].val == 0 || dist[e[x][i].to] != dist[x] + 1) continue; ll tmp = dfs(e[x][i].to, min(f, e[x][i].val), t); if (tmp > 0) { e[x][i].val -= tmp; e[e[x][i].to][e[x][i].rev].val += tmp; return tmp; } } return 0; } ll Dinic(ll s, ll t) { ll ans = 0; while (bfs(s, t)) { for (int i = s; i <= t; i++) cur[i] = 0; while (true) { ll tmp = dfs(s, INF, t); if (tmp) ans += tmp; else break; } } return ans; } void addedge(ll u, ll v, ll w) { e[u].push_back(Edge(v, w, e[v].size())); e[v].push_back(Edge(u, 0, e[u].size() - 1)); } int main() { cin >> n >> m >> k; for (ll i = 1; i <= m; i++) cin >> edges[i].u >> edges[i].v >> edges[i].p >> edges[i].q >> edges[i].w; for (ll i = 1; i <= m; i++) addedge(i, i + m, edges[i].w); for (ll i = 1; i <= m; i++) for (ll j = 1; j <= m; j++) if (i != j) { if (edges[i].v != edges[j].u) continue; if (edges[i].q + k > edges[j].p) continue; addedge(i + m, j, INF); } S = 0, T = m * 2 + 1; for (ll i = 1; i <= m; i++) { if (edges[i].u == 1) addedge(S, i, edges[i].w); if (edges[i].v == n) addedge(i + m, T, edges[i].w); } cout << Dinic(S, T) << endl; return 0; }