結果
問題 |
No.1301 Strange Graph Shortest Path
|
ユーザー |
![]() |
提出日時 | 2025-04-22 11:11:50 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 206 ms / 3,000 ms |
コード長 | 1,860 bytes |
コンパイル時間 | 2,579 ms |
コンパイル使用メモリ | 207,440 KB |
実行使用メモリ | 42,276 KB |
最終ジャッジ日時 | 2025-04-22 11:12:00 |
合計ジャッジ時間 | 9,616 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define int ll #define fast_io cin.tie(0)->sync_with_stdio(0); #define endl '\n' typedef long long ll; const int INF = 1e18; struct mincf { using T = pair<int, int>; struct E { int to, rev, cap, cost;}; int n; vector<vector<E>> g; vector<int> h, d, pv, pe; mincf(int _n): n(_n), g(n), h(n), d(n), pv(n), pe(n) {} void add(int a, int b, int c, int w) { g[a].push_back({b, (int)g[b].size(), c, w}); g[b].push_back({a, (int)g[a].size()-1, 0, -w}); } T go(int s,int t,int f){ priority_queue<T, vector<T>, greater<T>> q; fill(d.begin(), d.end(), INF); d[s] = 0; q.emplace(0, s); while (q.size()) { auto [a, v] = q.top(); q.pop(); if (d[v] < a) continue; if (v == t) break; for (int i = 0; i < g[v].size(); i++) { E e = g[v][i]; if (e.cap > 0) { int w = d[v]+e.cost+h[v]-h[e.to]; if (w < d[e.to]) { d[e.to] = w; q.emplace(w, e.to); pv[e.to] = v; pe[e.to] = i; } } } } if (d[t] == INF) return T(0, 0); for (int i = 0; i < n; i++) h[i]=min(h[i]+min(d[i],d[t]),INF); int a=f; for (int v=t; v!=s; v=pv[v]) a = min(a, g[pv[v]][pe[v]].cap); for (int v=t; v!=s; v=pv[v]){ E& e = g[pv[v]][pe[v]]; e.cap -= a; g[e.to][e.rev].cap += a; } return T(h[t], a); } T calc(int s,int t,int f){ int a = 0, res = 0; while (f>0) { auto [qt, w] = go(s,t,f); if (w == 0) break; a += w; f -= w; res += qt*w; } return {a, res}; } }; int32_t main() { fast_io; int n, m; cin >> n >> m; mincf g(n); for (int i = 0; i < m; i++) { int u, v, w, t; cin >> u >> v >> w >> t; --u, --v; g.add(u, v, 1, w); g.add(v, u, 1, w); g.add(u, v, 1, t); g.add(v, u, 1, t); } cout << g.calc(0, n - 1, 2).second << endl; }