QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#564081#3855. Regional developmentFortitude#WA 0ms3636kbC++232.5kb2024-09-14 19:45:342024-09-14 19:45:35

Judging History

你现在查看的是最新测评结果

  • [2024-09-14 19:45:35]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3636kb
  • [2024-09-14 19:45:34]
  • 提交

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