QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#708307 | #3855. Regional development | ahsoltan# | RE | 0ms | 0kb | C++20 | 2.9kb | 2024-11-03 21:18:38 | 2024-11-03 21:18:39 |
answer
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) int((x).size())
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
#ifdef LOCAL
auto operator<<(auto& o, auto x) -> decltype(x.first, o);
auto operator<<(auto& o, auto x) -> decltype(x.end(), o) {
o << "{";
for (int i = 0; auto y : x) o << ", " + !i++ * 2 << y;
return o << "}";
}
auto operator<<(auto& o, auto x) -> decltype(x.first, o) {
return o << "(" << x.first << ", " << x.second << ")";
}
void __print(auto... x) { ((cerr << x << " "), ...) << endl; }
#define debug(x...) __print("[" #x "]:", x)
#else
#define debug(...) 2137
#endif
struct Dinic {
struct Edge {
int to, rev;
ll c, oc;
ll flow() { return max(oc - c, 0LL); }
};
vi lvl, ptr, q;
vector<vector<Edge>> adj;
Dinic(int n) : lvl(n), ptr(n), q(n), adj(n) {}
void addEdge(int a, int b, ll c, ll rcap = 0) {
debug(a, b, c, rcap);
adj[a].push_back({b, sz(adj[b]), c, c});
adj[b].push_back({a, sz(adj[a]) - 1, rcap, rcap});
}
ll dfs(int v, int t, ll f) {
if (v == t || !f) return f;
for (int& i = ptr[v]; i < sz(adj[v]); i++) {
Edge& e = adj[v][i];
if (lvl[e.to] == lvl[v] + 1)
if (ll p = dfs(e.to, t, min(f, e.c))) {
e.c -= p, adj[e.to][e.rev].c += p;
return p;
}
}
return 0;
}
ll calc(int s, int t) {
ll flow = 0; q[0] = s;
rep(L, 0, 31) do {
lvl = ptr = vi(sz(q));
int qi = 0, qe = lvl[s] = 1;
while (qi < qe && !lvl[t]) {
int v = q[qi++];
for (Edge e : adj[v])
if (!lvl[e.to] && e.c >> (30 - L))
q[qe++] = e.to, lvl[e.to] = lvl[v] + 1;
}
while (ll p = dfs(s, t, LLONG_MAX)) flow += p;
} while (lvl[t]);
return flow;
}
};
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, r, m;
cin >> n >> r >> m;
Dinic g(n + 2);
int S = n, T = n + 1;
vi sum(n);
vector<array<int, 3>> ed(r);
map<pii, int> id;
rep(i, 0, r) {
int u, v, c;
cin >> u >> v >> c;
u--; v--;
//g.addEdge(u, v, m - 1 - c, m - 1 + c);
//g.addEdge(u, v, m - 1 - c, m - 1 + c);
g.addEdge(u, v, m - 1 - c);
g.addEdge(v, u, m - 1 + c);
sum[u] -= c;
sum[v] += c;
ed[i] = {u, v, c};
id[{min(u, v), max(u, v)}] = i;
}
int sp = 0;
int sn = 0;
rep(i, 0, n) {
debug(i, sum[i]);
if (sum[i] < 0) {
g.addEdge(i, T, -sum[i]);
sn -= sum[i];
} else if (sum[i] > 0) {
g.addEdge(S, i, sum[i]);
sp += sum[i];
}
}
assert(sp == sn);
if (g.calc(S, T) != sp) {
cout << "IMPOSSIBLE\n";
return 0;
}
for (int i = 0; i < n; i++) for (auto& e : g.adj[i]) if (e.to < n) {
int x = id[pair(min(i, e.to), max(i, e.to))];
if (ed[x][0] == i) ed[x][2] += e.flow();
else ed[x][2] -= e.flow();
}
rep(i, 0, r) {
debug(ed[i][0], ed[i][1]);
assert(ed[i][2] != 0);
cout << ed[i][2] << '\n';
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Runtime Error
input:
10 23 3 2 10 1 2 6 1 6 9 1 7 9 1 6 7 1 3 6 1 1 3 1 1 6 2 6 10 1 2 9 1 4 9 2 4 7 2 3 10 2 3 9 1 6 8 1 7 8 2 3 5 1 5 9 1 8 9 2 3 8 2 1 5 2 1 4 1 5 10 2