QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#564081 | #3855. Regional development | Fortitude# | WA | 0ms | 3636kb | C++23 | 2.5kb | 2024-09-14 19:45:34 | 2024-09-14 19:45:35 |
Judging History
answer
#include <bits/stdc++.h>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define f first
#define s second
#define V vector
using namespace std;
using ll = long long;
using pii = pair <int, int>;
using vi = vector <int>;
const int N = 1e3 + 5, inf = 1e9;
using F = ll;
struct Edge {
int to;
F flo, cap;
};
struct Dinic {
int N; V<Edge> eds; V<vi> adj;
void init(int _N) {
N = _N;
adj.resize(N);
cur.resize(N);
}
void ae(int u, int v, F cap, F rcap = 0) {
adj[u].pb(sz(eds));
eds.pb({v, 0, cap});
adj[v].pb(sz(eds));
eds.pb({u, 0, rcap});
}
vi lev; V<vi::iterator> cur;
bool bfs(int s, int t) {
lev = vi(N, -1);
for (int i = 0; i < N; ++i) {
cur[i] = begin(adj[i]);
}
queue <int> q({s}); lev[s] = 0;
while (sz(q)) {
int u = q.front();
q.pop();
for (auto e : adj[u]) {
const Edge& E = eds[e];
int v = E.to;
if (lev[v] < 0 && E.flo < E.cap)
q.push(v), lev[v] = lev[u] + 1;
}
}
return lev[t] >= 0;
}
F dfs(int v, int t, F flo) {
if (v == t)
return flo;
for (; cur[v] != end(adj[v]); cur[v]++) {
Edge& E = eds[*cur[v]];
if (lev[E.to] != lev[v] + 1 || E.flo == E.cap) continue;
F df = dfs(E.to, t, min(flo, E.cap - E.flo));
if (df) {
E.flo += df;
eds[*cur[v] ^ 1].flo -= df;
return df;
}
}
return 0;
}
F maxFlow(int s, int t) {
F tot = 0;
while (bfs(s, t)) {
while (F df = dfs(s, t, numeric_limits<F>::max())) tot += df;
}
return tot;
}
};
ll out[N], in[N], n, r, m;
int main() {
ios :: sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> r >> m;
Dinic d;
d.init(n + 2);
map <pii, int> edge;
vector <ll> ans(r);
for (int i = 0; i < r; ++i) {
int u, v, c;
cin >> u >> v >> c;
ans[i] = c;
edge[{u, v}] = i;
d.ae(u, v, inf);
out[u] += c;
in[v] += c;
}
int sum = 0;
for (int i = 1; i <= n; ++i) {
if (out[i] - in[i] > 0) {
sum += (out[i] - in[i]) / m;
d.ae(0, i, (out[i] - in[i]) / m);
}
else if (out[i] - in[i] < 0)
d.ae(i, n + 1, -(out[i] - in[i]) / m);
}
if (d.maxFlow(0, n + 1) != sum) {
cout << "IMPOSSIBLE";
return 0;
}
for (int i = 1; i <= n; ++i) {
for (auto e : d.adj[i]) {
const Edge&E = d.eds[e];
int j = E.to;
if (edge.count({i, j}) && E.flo > 0) {
int k = edge[{i, j}];
ans[k] -= m;
}
}
}
for (int i = 0; i < r; ++i)
cout << ans[i] << '\n';
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3636kb
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
output:
-2 1 1 1 1 1 -2 2 1 1 -1 2 -1 -2 1 2 1 1 2 -1 2 1 2
result:
wrong answer wrong plan