結果
| 問題 |
No.1301 Strange Graph Shortest Path
|
| コンテスト | |
| ユーザー |
otogawa
|
| 提出日時 | 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;
}
otogawa