結果
| 問題 |
No.654 Air E869120
|
| コンテスト | |
| ユーザー |
merom686
|
| 提出日時 | 2018-02-24 00:18:10 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,154 bytes |
| コンパイル時間 | 1,164 ms |
| コンパイル使用メモリ | 94,604 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-10-10 05:42:20 |
| 合計ジャッジ時間 | 2,391 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 22 WA * 13 |
ソースコード
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct Graph {
static constexpr int INF = 1 << 30;
struct Edge {
int i, r, f, f2;
};
Graph(int n) : v(n), h(n), q(n), e(n) {}
void add_edge(int i, int j, int f) {
int r0 = e[j].size();
int r1 = e[i].size();
e[i].push_back({ j, r0, max(+f, 0) });
e[j].push_back({ i, r1, max(-f, 0) });
}
void bfs(int i0, int i1) {
fill(v.begin(), v.end(), -1);
v[i0] = 0;
int j0 = 0, j1 = 0;
q[j1++] = i0;
while (j0 < j1) {
int i = q[j0++];
for (Edge& o : e[i]) {
if (v[o.i] >= 0 || o.f == 0) continue;
v[o.i] = v[i] + 1;
if (o.i == i1) return;
q[j1++] = o.i;
}
}
}
int dfs(int i, int i1, int f0) {
for (; h[i] < e[i].size(); h[i]++) {
Edge& o = e[i][h[i]];
if (v[o.i] <= v[i] || o.f == 0) continue;
int f = min(f0, o.f);
if (o.i != i1) f = dfs(o.i, i1, f);
if (f == 0) continue;
o.f -= f;
e[o.i][o.r].f += f;
return f;
}
return 0;
}
int64_t max_flow(int i0, int i1) { // i0 != i1
for (int64_t f = 0;;) {
bfs(i0, i1);
if (v[i1] < 0) return f;
fill(h.begin(), h.end(), 0);
while (1) {
int t = dfs(i0, i1, INF);
if (t == 0) break;
f += t;
}
}
}
vector<int> v, h, q;
vector<vector<Edge>> e;
};
void coco(vector<int>& v) {
size_t n = v.size();
vector<pair<int, int>> t(n);
for (int i = 0; i < n; i++) {
t[i] = { v[i], i };
}
sort(t.begin(), t.end());
int k = 0;
for (int i = 0; i < n; i++) {
if (i > 0 && t[i].first != t[i - 1].first) k++;
v[t[i].second] = k;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, d;
cin >> n >> m >> d;
vector<int> u(m), v(m), w(m);
vector<vector<int>> p(n);
for (int i = 0; i < m; i++) {
int p0, p1;
cin >> u[i] >> v[i] >> p0 >> p1 >> w[i];
u[i]--; v[i]--; p1 += d;
p[u[i]].push_back(p0);
p[v[i]].push_back(p1);
}
vector<int> k(n + 1);
for (int i = 0; i < n; i++) {
if (p[i].empty()) continue;
coco(p[i]);
k[i + 1] = 1 + *max_element(p[i].begin(), p[i].end());
}
for (int i = 0; i < n; i++) {
k[i + 1] += k[i];
}
Graph g(k[n]);
for (int i = 0; i < n; i++) {
for (int j = k[i]; j < k[i + 1] - 1; j++) {
g.add_edge(j, j + 1, Graph::INF);
}
}
vector<int> l(n);
for (int i = 0; i < m; i++) {
g.add_edge(k[u[i]] + p[u[i]][l[u[i]]++], k[v[i]] + p[v[i]][l[v[i]]++], w[i]);
}
if (k[1] - k[0] == 0 || k[n] - k[n - 1] == 0) {
cout << 0 << endl;
quick_exit(0);
}
cout << g.max_flow(0, k[n] - 1) << endl;
return 0;
}
merom686