結果
| 問題 |
No.654 Air E869120
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-05-18 20:41:50 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 10 ms / 2,000 ms |
| コード長 | 1,999 bytes |
| コンパイル時間 | 1,923 ms |
| コンパイル使用メモリ | 201,628 KB |
| 実行使用メモリ | 7,848 KB |
| 最終ジャッジ日時 | 2025-05-18 20:41:54 |
| 合計ジャッジ時間 | 3,636 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 35 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e4 + 5, M = 4e6 + 5;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll n, m, k, S, T;
struct Airline {
ll u, v, p, q, w;
} edges[N];
struct Edge {
ll to, val, rev;
Edge(ll t = 0, ll v = 0, ll r = 0) {
to = t, val = v, rev = r;
}
};
vector<Edge> e[N];
ll dist[N];
ll cur[N]; //?????
bool bfs(ll s, ll t) {
queue<ll> q;
for (ll i = s; i <= t; i++)
dist[i] = -1;
q.push(s);
dist[s] = 0;
while (!q.empty()) {
ll h = q.front();
q.pop();
for (auto i: e[h])
if (i.val > 0 && dist[i.to] == -1) {
dist[i.to] = dist[h] + 1;
q.push(i.to);
}
}
return dist[t] != -1;
}
ll dfs(ll x, ll f, ll t) {
if (x == t || f == 0)
return f;
for (ll i = cur[x]; i < e[x].size(); i = ++cur[x]) {
if (e[x][i].val == 0 || dist[e[x][i].to] != dist[x] + 1)
continue;
ll tmp = dfs(e[x][i].to, min(f, e[x][i].val), t);
if (tmp > 0) {
e[x][i].val -= tmp;
e[e[x][i].to][e[x][i].rev].val += tmp;
return tmp;
}
}
return 0;
}
ll Dinic(ll s, ll t) {
ll ans = 0;
while (bfs(s, t)) {
for (int i = s; i <= t; i++)
cur[i] = 0;
while (true) {
ll tmp = dfs(s, INF, t);
if (tmp)
ans += tmp;
else
break;
}
}
return ans;
}
void addedge(ll u, ll v, ll w) {
e[u].push_back(Edge(v, w, e[v].size()));
e[v].push_back(Edge(u, 0, e[u].size() - 1));
}
int main() {
cin >> n >> m >> k;
for (ll i = 1; i <= m; i++)
cin >> edges[i].u >> edges[i].v >> edges[i].p >> edges[i].q >> edges[i].w;
for (ll i = 1; i <= m; i++)
addedge(i, i + m, edges[i].w);
for (ll i = 1; i <= m; i++)
for (ll j = 1; j <= m; j++)
if (i != j) {
if (edges[i].v != edges[j].u)
continue;
if (edges[i].q + k > edges[j].p)
continue;
addedge(i + m, j, INF);
}
S = 0, T = m * 2 + 1;
for (ll i = 1; i <= m; i++) {
if (edges[i].u == 1)
addedge(S, i, edges[i].w);
if (edges[i].v == n)
addedge(i + m, T, edges[i].w);
}
cout << Dinic(S, T) << endl;
return 0;
}
vjudge1