結果
問題 | No.654 Air E869120 |
ユーザー |
![]() |
提出日時 | 2024-04-24 01:23:19 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
MLE
|
実行時間 | - |
コード長 | 2,939 bytes |
コンパイル時間 | 1,702 ms |
コンパイル使用メモリ | 113,428 KB |
最終ジャッジ日時 | 2025-02-21 08:47:30 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 5 |
other | MLE * 1 -- * 34 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <map>#include <queue>#include <set>#include <iomanip>using namespace std;typedef long long ll;#define rep(i, n) for(int i = 0; i < (n); i++)template<class T>using vi = vector<T>;template<class T>using vii = vector<vi<T>>;template<class T>using viii = vector<vii<T>>;struct Dinic {private:const long long inf = 1e18;vector<int> dist; //sからの距離vector<int> iter; //どこまで調べたかpublic:struct edge {int to, rev; long long cap;edge(int t = 0, int r = 0, long long c = 0LL) : to(t), rev(r), cap(c) {}};int n;vector<vector<edge>> to;Dinic(int n_ = 1) : n(n_), to(n_), dist(n_), iter(n_) {}void addedge(int u, int v, long long cap) {//u->vにcapの容量int su = (int)to[u].size(), sv = (int)to[v].size();to[u].push_back({ v, sv, cap });to[v].push_back({ u, su, 0 });}long long dfs(int v, int t, long long f) { //t: 終点, f: flowif (v == t) return f;int sv = (int)to[v].size();for (int& i = iter[v]; i < sv; i++) {edge& nv = to[v][i];if (dist[nv.to] < dist[v] || nv.cap == 0) continue;long long nf = dfs(nv.to, t, min(f, nv.cap));if (nf > 0) {nv.cap -= nf;to[nv.to][nv.rev].cap += nf;return nf;}}return 0;}void bfs(int s) {dist.resize(n, -1);queue<int> q;q.push(s);dist[s] = 0;while (!q.empty()) {int v = q.front();q.pop();for (auto nv : to[v]) {if (nv.cap > 0 && dist[nv.to] < 0) {dist[nv.to] = dist[v] + 1;q.push(nv.to);}}}}long long maxflow(int s, int t) {//s:始点, t:終点long long res = 0, flow = 0;while (true) {bfs(s);if (dist[t] < 0) break;iter.resize(n, 0);while (flow = dfs(s, t, inf)) res += flow;};return res;}};int main(){int n, m, d;cin >> n >> m >> d;vi<int> u(m), v(m), p(m), q(m); vi<ll> w(m);rep(i, m) cin >> u[i] >> v[i] >> p[i] >> q[i] >> w[i];rep(i, m) u[i]--, v[i]--;rep(i, m) q[i] += d;vi<map<int, int>> mp(n);rep(i, m) {mp[u[i]][p[i]];mp[v[i]][q[i]];}const ll inf = 1e18;Dinic ff(n * m);int idx = 0;rep(i, n) {bool ng = true;for (auto& elem : mp[i]) {elem.second = idx;if (ng) ng = false;else ff.addedge(idx - 1, idx, inf);idx++;}}rep(i, m) ff.addedge(mp[u[i]][p[i]], mp[v[i]][q[i]], w[i]);ll res = ff.maxflow(0, idx - 1);cout << res << endl;return 0;}