結果
| 問題 |
No.654 Air E869120
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-05-20 17:50:52 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 11 ms / 2,000 ms |
| コード長 | 2,719 bytes |
| コンパイル時間 | 2,141 ms |
| コンパイル使用メモリ | 201,332 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2025-05-20 17:50:56 |
| 合計ジャッジ時間 | 4,114 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 35 |
ソースコード
/*
* Author: ttq012
* Date: 05/20/2025
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5010;
const int mod = 1e9 + 7;
const int inf = 1e18;
struct Plane
{
int u, v, p, q, w;
} pl[N];
namespace Flow
{
int S, T;
struct Edge
{
int e, f, o;
inline Edge(int a, int b)
{
e = a, f = b, o = 0;
}
} ;
vector<Edge> adj[N];
int dep[N];
void ae(int a, int b, int c)
{
adj[a].push_back(Edge(b, c));
adj[b].push_back(Edge(a, 0));
int s1 = adj[a].size() - 1, s2 = adj[b].size() - 1;
adj[a][s1].o = s2, adj[b][s2].o = s1;
}
int bfs()
{
queue<int> q;
memset(dep, 0, sizeof dep);
q.emplace(S);
dep[S] = 1;
while (q.size())
{
int t = q.front();
q.pop();
for (int i = 0; i < adj[t].size(); ++i)
{
int r = adj[t][i].e, f = adj[t][i].f, o = adj[t][i].o;
if (f && !dep[r])
{
dep[r] = dep[t] + 1;
q.emplace(r);
if (r == T)
return 1;
}
}
}
return 0;
}
int dfs(int p, int f)
{
if (p == T)
return f;
int s = 0;
for (int i = 0; i < adj[p].size(); ++i)
{
if (!f)
break;
int q = adj[p][i].e, fx = adj[p][i].f;
if (fx && dep[p] + 1 == dep[q])
{
int delta = dfs(q, min(f, fx));
adj[p][i].f -= delta;
adj[q][adj[p][i].o].f += delta;
f -= delta;
s += delta;
}
}
return s ? s : (dep[p] = 0);
}
int dinic()
{
int s = 0;
while (bfs())
s += dfs(S, inf);
return s;
}
}
signed main()
{
// freopen("travel.in", "r", stdin);
// freopen("travel.out", "w", stdout);
int n, m, d;
cin >> n >> m >> d;
for (int i = 1; i <= m; ++i)
cin >> pl[i].u >> pl[i].v >> pl[i].p >> pl[i].q >> pl[i].w;
Flow::S = N - 1, Flow::T = N - 2;
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= m; ++j)
if (i != j && pl[i].v == pl[j].u && pl[i].q + d <= pl[j].p)
Flow::ae(i + m, j, inf);
for (int i = 1; i <= m; ++i)
Flow::ae(i, i + m, pl[i].w);
for (int i = 1; i <= m; ++i)
{
if (pl[i].u == 1)
Flow::ae(Flow::S, i, pl[i].w);
if (pl[i].v == n)
Flow::ae(i + m, Flow::T, pl[i].w);
}
cout << Flow::dinic() << '\n';
return 0;
}