結果

問題 No.654 Air E869120
ユーザー NAMIDAIRO
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#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->vcap
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: flow
if (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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0