結果
| 問題 | No.654 Air E869120 |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-03-18 11:30:39 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 48 ms / 2,000 ms |
| コード長 | 2,171 bytes |
| 記録 | |
| コンパイル時間 | 1,375 ms |
| コンパイル使用メモリ | 111,248 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-18 03:24:36 |
| 合計ジャッジ時間 | 3,396 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 35 |
ソースコード
#include <iostream>
#include <map>
#include <vector>
using namespace std;
using i64 = int64_t;
struct edge { int to; i64 avail; int rev; };
constexpr i64 inf = 987'654'321'987'654'321LL;
int n;
vector<vector<edge>> G;
vector<int> ptr;
vector<bool> used;
void add_edge(int u, int v, i64 c) {
G[u].push_back(edge{v, c, ptr[v]++});
G[v].push_back(edge{u, 0, ptr[u]++});
}
i64 dfs(int v, int t, i64 flow) {
if(v == t) { return flow; }
used[v] = true;
for(edge &e : G[v]) {
edge &x = G[e.to][e.rev];
if(!used[e.to] && e.avail) {
i64 res = dfs(e.to, t, min(e.avail, flow));
if(res) {
e.avail -= res;
x.avail += res;
return res;
}
}
}
return 0;
}
i64 max_flow(int s, int t) {
i64 res = 0;
for(;;) {
used.assign(n, false);
i64 flow = dfs(s, t, inf);
if(flow == 0) { return res; }
res += flow;
}
}
int main(void) {
int N, M, d; scanf("%d%d%d", &N, &M, &d);
int idx = 0;
map<tuple<int, int, bool>, int> mp; // mp[(街,時刻,発か)] := id
vector<tuple<int, int, int, int, int>> logs;
for(int i=0; i<M; ++i) {
int u, v, p, q, w; scanf("%d%d%d%d%d", &u, &v, &p, &q, &w);
auto k0 = make_tuple(u, p, true),
k1 = make_tuple(v, q, false);
if(!mp.count(k0)) { mp[k0] = idx++; }
if(!mp.count(k1)) { mp[k1] = idx++; }
logs.emplace_back(u, v, p, q, w);
}
::n = idx + 2;
G.assign(n, vector<edge>());
ptr.assign(n, 0);
int src = idx, dst = src + 1;
for(auto tup : logs) {
int u, v, p, q, w; tie(u, v, p, q, w) = tup;
auto k0 = make_tuple(u, p, true),
k1 = make_tuple(v, q, false);
add_edge(mp[k0], mp[k1], w);
if(u == 1) { add_edge(src, mp[k0], inf); }
if(v == N) { add_edge(mp[k1], dst, inf); }
}
for(auto kv0 : mp) {
tuple<int, int, bool> k0; int v0; tie(k0, v0) = kv0;
int u, p, f0; tie(u, p, f0) = k0;
for(auto kv1 : mp) {
tuple<int, int, bool> k1; int v1; tie(k1, v1) = kv1;
int v, q, f1; tie(v, q, f1) = k1;
if(u == v && !f0 && f1 && p+d <= q) {
add_edge(mp[k0], mp[k1], inf);
}
}
}
i64 maxi = max_flow(src, dst);
printf("%ld\n", maxi);
return 0;
}