QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#917167#602. 最小费用最大流(随机数据)definieren#100 ✓467ms4716kbC++203.4kb2025-02-27 09:15:392025-02-27 09:15:39

Judging History

This is the latest submission verdict.

  • [2025-02-27 09:15:39]
  • Judged
  • Verdict: 100
  • Time: 467ms
  • Memory: 4716kb
  • [2025-02-27 09:15:39]
  • Submitted

answer

#include <bits/stdc++.h>

template<class Cap, class Cost>
struct Flow {
	struct Edge {
		int from, to;
		Cap cap, flow;
		Cost cost;
	};
	struct _Edge {
		int to, rev;
		Cap cap;
		Cost cost;
	};
	struct Graph {
		std::vector<int> head;
		std::vector<_Edge> elist;
		
		explicit Graph(int n,
			const std::vector<std::pair<int, _Edge>>& edges) {
			head.assign(n + 1, 0), elist.resize(edges.size());
			for (auto e : edges) ++ head[e.first + 1];
			for (int i = 0; i < n; i ++) head[i + 1] += head[i];
			auto cnt = head;
			for (auto e : edges) {
				elist[cnt[e.first] ++] = e.second;
			}
		}
	};
	
	int n;
	std::vector<Edge> edge;
	
	Flow(int _n): n(_n), edge{} {}
	
	void Add_Edge(int u, int v, Cap cap, Cost cost) {
		assert(0 <= u && u < n);
		assert(0 <= v && v < n);
		assert(cap >= 0), assert(0 <= cost);
		
		edge.emplace_back(u, v, cap, 0, cost);
		return;
	}
	std::pair<Cap, Cost> MCMF(int S, int T) {
		assert(0 <= S && S < n);
		assert(0 <= T && T < n);
		
		const int m = static_cast<int>(edge.size());
		std::vector<int> idx(m), rev(m), deg(n);
		std::vector<std::pair<int, _Edge>> elist(2 * m);
		
		for (int i = 0; i < m; i ++) {
			auto e = edge[i];
			idx[i] = deg[e.from] ++;
			rev[i] = deg[e.to] ++;
			elist[2 * i] = {e.from, {e.to, -1, e.cap - e.flow, e.cost}};
			elist[2 * i + 1] = {e.to, {e.from, -1, e.flow, - e.cost}};
		}
		auto G = Graph(n, elist);
		for (int i = 0; i < m; i ++) {
			auto e = edge[i];
			idx[i] += G.head[e.from];
			rev[i] += G.head[e.to];
			G.elist[idx[i]].rev = rev[i];
			G.elist[rev[i]].rev = idx[i];
		}
		
		auto ans = Slope(G, S, T).back();
		
		for (int i = 0; i < m; i ++) {
			auto e = G.elist[idx[i]];
			edge[i].flow = edge[i].cap - e.cap;
		}
		
		return ans;
	}
	std::vector<std::pair<Cap, Cost>> Slope(Graph G, int S, int T) {
		const Cap inf = std::numeric_limits<Cap>::max();
		const Cost INF = std::numeric_limits<Cost>::max();
		std::vector<int> pre(n);
		std::vector<Cost> dist(n);
		std::vector<bool> vis(n);
		
		auto SPFA = [&]() {
			std::queue<int> Q;
			fill(dist.begin(), dist.end(), INF);
			fill(vis.begin(), vis.end(), false);
			Q.emplace(S), dist[S] = 0, vis[S] = true;
			while (Q.size()) {
				int u = Q.front();
				vis[u] = false, Q.pop();
				for (int i = G.head[u]; i < G.head[u + 1]; i ++) {
					auto e = G.elist[i];
					if (e.cap && dist[u] + e.cost < dist[e.to]) {
						dist[e.to] = dist[u] + e.cost, pre[e.to] = e.rev;
						if (!vis[e.to]) Q.emplace(e.to), vis[e.to] = true;
					}
				}
			}
			return dist[T] != INF;
		};
		
		Cap flow = 0; Cost cost = 0, pre_slope = -1;
		std::vector<std::pair<Cap, Cost>> slope{{Cap(0), Cost(0)}};
		while (SPFA()) {
			Cap c = inf, d = dist[T];
			for (int u = T; u != S; u = G.elist[pre[u]].to)
				c = std::min(c, G.elist[G.elist[pre[u]].rev].cap);
			for (int u = T; u != S; u = G.elist[pre[u]].to) {
				auto &e = G.elist[pre[u]];
				e.cap += c, G.elist[e.rev].cap -= c;
			}
			flow += c, cost += c * d;
			if (pre_slope == d) slope.back() = {flow, cost};
			else slope.emplace_back(flow, cost);
			pre_slope = d;
		}
		return slope;
	}
};

int main() {
	int n, m;
	std::cin >> n >> m;
	int S = 0, T = n - 1;
	
	Flow<int, int> G(n);
	for (int i = 0; i < m; i ++) {
		int u, v, c, w;
		std::cin >> u >> v >> c >> w;
		G.Add_Edge(-- u, -- v, c, w);
	}
	
	auto [mxf, mnc] = G.MCMF(S, T);
	std::cout << mxf << ' ' << mnc << '\n';
	
	return 0;
}

詳細信息


Pretests


Final Tests

Test #1:

score: 10
Accepted
time: 0ms
memory: 3584kb

input:

8 27
2 3 2147483647 100
1 3 1 100
2 4 2147483647 10
1 4 1 10
2 4 2147483647 10
1 4 1 10
2 8 3 0
3 5 2147483647 100
1 5 1 100
3 8 1 0
3 2 2147483647 0
4 5 2147483647 10
1 5 1 10
4 8 1 0
4 2 2147483647 0
5 6 2147483647 1
1 6 1 1
5 6 2147483647 1
1 6 1 1
5 7 2147483647 1
1 7 1 1
5 8 3 0
5 2 2147483647 ...

output:

8 243

result:

ok 2 number(s): "8 243"

Test #2:

score: 10
Accepted
time: 1ms
memory: 3584kb

input:

12 49
2 10 2147483647 5
1 10 1 5
2 5 2147483647 50
1 5 1 50
2 9 2147483647 8
1 9 1 8
2 8 2147483647 47
1 8 1 47
2 11 2147483647 17
1 11 1 17
2 12 5 0
3 12 0 0
3 2 2147483647 0
4 6 2147483647 18
1 6 1 18
4 11 2147483647 12
1 11 1 12
4 9 2147483647 14
1 9 1 14
4 12 3 0
4 2 2147483647 0
5 11 2147483647...

output:

15 436

result:

ok 2 number(s): "15 436"

Test #3:

score: 10
Accepted
time: 0ms
memory: 3584kb

input:

27 169
2 15 2147483647 24
1 15 1 24
2 19 2147483647 96
1 19 1 96
2 12 2147483647 49
1 12 1 49
2 13 2147483647 75
1 13 1 75
2 24 2147483647 2
1 24 1 2
2 27 5 0
3 27 0 0
3 2 2147483647 0
4 11 2147483647 99
1 11 1 99
4 3 2147483647 85
1 3 1 85
4 27 2 0
4 2 2147483647 0
5 27 0 0
5 2 2147483647 0
6 9 214...

output:

60 4338

result:

ok 2 number(s): "60 4338"

Test #4:

score: 10
Accepted
time: 12ms
memory: 3776kb

input:

77 2149
2 42 2147483647 33
1 42 1 33
2 68 2147483647 30
1 68 1 30
2 76 2147483647 13
1 76 1 13
2 51 2147483647 93
1 51 1 93
2 12 2147483647 39
1 12 1 39
2 57 2147483647 74
1 57 1 74
2 70 2147483647 21
1 70 1 21
2 73 2147483647 24
1 73 1 24
2 52 2147483647 54
1 52 1 54
2 15 2147483647 99
1 15 1 99
2 ...

output:

1000 74606

result:

ok 2 number(s): "1000 74606"

Test #5:

score: 10
Accepted
time: 49ms
memory: 3840kb

input:

102 4199
2 48 2147483647 42
1 48 1 42
2 85 2147483647 50
1 85 1 50
2 22 2147483647 83
1 22 1 83
2 95 2147483647 97
1 95 1 97
2 82 2147483647 34
1 82 1 34
2 25 2147483647 72
1 25 1 72
2 4 2147483647 17
1 4 1 17
2 47 2147483647 10
1 47 1 10
2 71 2147483647 12
1 71 1 12
2 68 2147483647 39
1 68 1 39
2 2...

output:

2000 161420

result:

ok 2 number(s): "2000 161420"

Test #6:

score: 10
Accepted
time: 51ms
memory: 3968kb

input:

102 4199
2 79 2147483647 13
1 79 1 13
2 83 2147483647 73
1 83 1 73
2 75 2147483647 90
1 75 1 90
2 30 2147483647 92
1 30 1 92
2 54 2147483647 25
1 54 1 25
2 66 2147483647 53
1 66 1 53
2 52 2147483647 37
1 52 1 37
2 63 2147483647 46
1 63 1 46
2 11 2147483647 20
1 11 1 20
2 55 2147483647 53
1 55 1 53
2...

output:

2000 143072

result:

ok 2 number(s): "2000 143072"

Test #7:

score: 10
Accepted
time: 49ms
memory: 3840kb

input:

102 4199
2 39 2147483647 45
1 39 1 45
2 51 2147483647 11
1 51 1 11
2 86 2147483647 63
1 86 1 63
2 23 2147483647 46
1 23 1 46
2 48 2147483647 63
1 48 1 63
2 87 2147483647 8
1 87 1 8
2 73 2147483647 63
1 73 1 63
2 5 2147483647 52
1 5 1 52
2 80 2147483647 21
1 80 1 21
2 31 2147483647 44
1 31 1 44
2 101...

output:

2000 146132

result:

ok 2 number(s): "2000 146132"

Test #8:

score: 10
Accepted
time: 413ms
memory: 4716kb

input:

302 10599
2 72 2147483647 169
1 72 1 169
2 260 2147483647 165
1 260 1 165
2 12 2147483647 108
1 12 1 108
2 16 2147483647 26
1 16 1 26
2 28 2147483647 148
1 28 1 148
2 7 2147483647 74
1 7 1 74
2 139 2147483647 199
1 139 1 199
2 231 2147483647 9
1 231 1 9
2 287 2147483647 123
1 287 1 123
2 135 2147483...

output:

5000 1106316

result:

ok 2 number(s): "5000 1106316"

Test #9:

score: 10
Accepted
time: 467ms
memory: 4588kb

input:

302 10599
2 222 2147483647 132
1 222 1 132
2 17 2147483647 7
1 17 1 7
2 177 2147483647 253
1 177 1 253
2 90 2147483647 195
1 90 1 195
2 128 2147483647 289
1 128 1 289
2 42 2147483647 193
1 42 1 193
2 213 2147483647 133
1 213 1 133
2 263 2147483647 293
1 263 1 293
2 50 2147483647 155
1 50 1 155
2 228...

output:

5000 1290871

result:

ok 2 number(s): "5000 1290871"

Test #10:

score: 10
Accepted
time: 430ms
memory: 4592kb

input:

302 10599
2 176 2147483647 289
1 176 1 289
2 190 2147483647 99
1 190 1 99
2 10 2147483647 96
1 10 1 96
2 240 2147483647 165
1 240 1 165
2 273 2147483647 205
1 273 1 205
2 248 2147483647 194
1 248 1 194
2 220 2147483647 122
1 220 1 122
2 194 2147483647 167
1 194 1 167
2 8 2147483647 67
1 8 1 67
2 227...

output:

5000 1395897

result:

ok 2 number(s): "5000 1395897"