結果
| 問題 |
No.1301 Strange Graph Shortest Path
|
| コンテスト | |
| ユーザー |
otogawa
|
| 提出日時 | 2025-04-22 11:17:11 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,854 bytes |
| コンパイル時間 | 2,197 ms |
| コンパイル使用メモリ | 205,940 KB |
| 実行使用メモリ | 40,188 KB |
| 最終ジャッジ日時 | 2025-04-22 11:17:32 |
| 合計ジャッジ時間 | 19,281 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 32 TLE * 1 |
ソースコード
#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 MinCost {
struct edge {
int to, next, cap, cost;
};
int n;
vector<int> first, prev, dist;
vector<bool> in;
vector<edge> g;
MinCost(int _n) : n(_n), first(n, -1), prev(n), dist(n), in(n) {};
void add(int u, int v, int c, int w) {
int id = g.size();
g.push_back({v, first[u], c, w});
first[u] = id;
g.push_back({u, first[v], 0, -w});
first[v] = ++id;
}
bool spfa(int s, int t) {
fill(dist.begin(), dist.end(), INF);
dist[s] = 0, in[s] = 1;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
in[u] = 0;
for (int e = first[u]; ~e; e = g[e].next) {
int v = g[e].to;
int ndist = dist[u] + g[e].cost;
if (g[e].cap > 0 && ndist < dist[v]) {
dist[v] = ndist;
prev[v] = e;
if (!in[v]) {
q.push(v);
in[v] = 1;
}
}
}
}
// return dist[t] < 0;
return dist[t] < INF;
}
pair<int, int> max_flow(int s, int t) {
int flow = 0, cost = 0;
while (spfa(s, t)) {
int cur = t, curf = INF;
while (cur != s) {
int e = prev[cur];
curf = min(curf, g[e].cap);
cur = g[e^1].to;
}
flow += curf;
cost += dist[t] * curf;
cur = t;
while (cur != s) {
int e = prev[cur];
g[e].cap -= curf;
g[e^1].cap += curf;
cur = g[e^1].to;
}
}
return {flow, cost};
}
};
int32_t main() {
fast_io;
int n, m; cin >> n >> m;
MinCost g(n + 1);
g.add(n, 0, 2, 0);
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.max_flow(n, n - 1).second << endl;
}
otogawa