QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#187295 | #3855. Regional development | RiverHamster# | TL | 0ms | 0kb | C++17 | 2.1kb | 2023-09-24 16:09:20 | 2023-09-24 16:09:21 |
answer
// #include <bits/stdc++.h>
// #include <unistd.h>
#include <cstdio>
#include <vector>
#include <cstring>
#include <array>
using namespace std;
using ll = long long;
#define LOG(f...) fprintf(stderr, f)
const int N = 1005;
int odeg[N];
const int Node = 1007, Edge = 12010;
struct edge {
int v, f, nt;
} e[Edge * 2];
int hd[Node], ec = 0, cur[Node];
int h[Node];
int S, T;
void link(int u, int v, int f) {
e[ec] = {v, f, hd[u]}; hd[u] = ec++;
e[ec] = {u, 0, hd[v]}; hd[v] = ec++;
}
bool BFS() {
static int q[Node];
int ql = -1, qr = -1;
q[++qr] = S; h[S] = 0;
memset(h, 0x3f, sizeof(h));
while (ql != qr) {
int u = q[++ql];
for (int i = hd[u]; ~i; i = e[i].nt)
if (e[i].f && h[e[i].v] == 0x3f3f3f3f)
h[e[i].v] = h[u] + 1, q[++qr] = e[i].v;
}
return h[T] != 0x3f3f3f3f;
}
int DFS(int u, int fl) {
if (u == T) return fl;
int ans = 0;
for (int &i = cur[u]; ~i; i = e[i].nt) {
if (h[e[i].v] == h[u] + 1 && e[i].f) {
int aug = min(fl, e[i].f);
aug = DFS(e[i].v, aug);
e[i].f -= aug; e[i ^ 1].f += aug;
fl -= aug; ans += aug;
if (!fl) return ans;
}
}
if (!ans) h[u] = 0x3f3f3f3f;
return ans;
}
int maxflow() {
int ans = 0;
while (BFS()) {
memcpy(cur, hd, sizeof(hd));
ans += DFS(S, 0x3f3f3f3f);
}
return ans;
}
int main() {
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
memset(hd, -1, sizeof(hd));
int n, m, M;
scanf("%d%d%d", &n, &m, &M);
vector<array<int, 4>> E;
for (int i = 0; i < m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
E.push_back({u, v, w});
odeg[u] += w; odeg[v] -= w;
}
S = n + 1; T = n + 2;
int req = 0;
for (int i = 1; i <= n; ++i)
if (odeg[i] > 0) link(S, i, odeg[i] / M), req += odeg[i] / M;
else if (odeg[i] < 0) link(i, T, -odeg[i] / M);
for (auto &e : E)
link(e[0], e[1], 1), e[3] = ec - 1;
int f = maxflow();
if (f != req) puts("IMPOSSIBLE");
else {
for (auto _e : E)
if (e[_e[3]].f) printf("%d\n", _e[2] - M);
else printf("%d\n", _e[2]);
}
}
详细
Test #1:
score: 0
Time Limit Exceeded
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