답안 #1030312

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1030312 2024-07-22T02:34:01 Z TIN Domino (COCI15_domino) C++17
60 / 160
316 ms 524292 KB
#include <bits/stdc++.h>

using namespace std;

#define FNAME "test"

typedef long long ll;

const ll oo = 1e18 + 1;

struct Edge {
	int from, to, cap;
	ll cost;

	Edge(int from, int to, int cap, ll cost) : from(from), to(to), cap(cap), cost(cost) {}
};

struct MinFlow {
	int n, k, s, t;

	vector<vector<int>> adj;
	vector<vector<int>> cap;
	vector<vector<ll>> cost;

	MinFlow(int _n, int _k, int _s, int _t) {
		n  = _n;
		k = _k;
		s = _s;
		t = _t;
		adj.assign(n, vector<int>());
		cost.assign(n, vector<ll>(n, 0));
		cap.assign(n, vector<int>(n, 0));
	}

	void addEdge(Edge e) {
		assert(0 <= e.from && e.from <= n);
		assert(0 <= e.to && e.to <= n);
		adj[e.from].push_back(e.to);
		adj[e.to].push_back(e.from);
		cost[e.from][e.to] = e.cost;
		cost[e.to][e.from] = -e.cost;
		cap[e.from][e.to] = e.cap;
	}

	void shortest_paths(int v0, vector<ll>& d, vector<int>& p) {
		d.assign(n, oo);
		d[v0] = 0;
		vector<bool> inq(n, false);
		queue<int> q;
		q.push(v0);
		p.assign(n, -1);
		while (!q.empty()) {
			int u = q.front(); q.pop();
			inq[u] = false;
			for (int v : adj[u]) {
				if (cap[u][v] > 0 && d[v] > d[u] + cost[u][v]) {
					d[v] = d[u] + cost[u][v];
					p[v] = u;
					if (!inq[v]) {
						inq[v] = true;
						q.push(v);
					}
				}
			}
		}
	}

	ll min_cost_flow() {
		int flow = 0;
		ll cost = 0;
		vector<ll> d;
		vector<int> p;
		while (flow < k) {
			shortest_paths(s, d, p);
			if (d[t] == oo) break;
			int f = k - flow;
			int cur = t;
			while (cur != s) {
				f = min(f, cap[p[cur]][cur]);
				cur = p[cur];
			}
			flow += f;
			cost += 1LL * f * d[t];
			cur = t;
			while (cur != s) {
				cap[p[cur]][cur] -= f;
				cap[cur][p[cur]] += f;
				cur = p[cur];
			}
		}
		if (flow < k) return -1;
		return cost;
	}
};

const ll lim = 4000;

int n, k;
ll x;
ll sum, ans;

void Task() {
	ios_base::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cout << fixed << setprecision(9);
	if (fopen(FNAME".inp","r")) {
		freopen(FNAME".inp","r",stdin);
		freopen(FNAME".out","w",stdout);
	}
}

void Solve() {
	//Your Code
	cin >> n >> k;
	MinFlow calc(n * n + 2, k, 0, n * n + 1);
	sum = 0;
	for (int i  = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> x;
			sum += x;
			x = lim - x;
			int id = (i - 1) * n + j;
			if ((i + 1 + j) & 1) {
				calc.addEdge(Edge(0, id, 1, x));
				if (i > 1) calc.addEdge(Edge(id, id - n, 1, 0));
				if (j > 1) calc.addEdge(Edge(id, id - 1, 1, 0));
			} else {
				calc.addEdge(Edge(id, n * n + 1, 1, x));
				if (i > 1) calc.addEdge(Edge(id - n, id, 1, 0));
				if (j > 1) calc.addEdge(Edge(id - 1, id, 1, 0));
			}
		}
	}
	ans = calc.min_cost_flow();
	cout << sum - 2LL * k * lim + ans << '\n';
}

int main() {
	Task();
	Solve();
	cerr << "\nTime run: " << 1000*clock()/CLOCKS_PER_SEC << "ms";
	return 37^37;
}

Compilation message

domino.cpp: In function 'void Task()':
domino.cpp:107:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |   freopen(FNAME".inp","r",stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
domino.cpp:108:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   freopen(FNAME".out","w",stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Runtime error 210 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 74320 KB Output is correct
2 Correct 32 ms 74324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 210 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 712 KB Output is correct
2 Correct 1 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 223 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 207 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 316 ms 524292 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 74332 KB Output is correct
2 Correct 32 ms 74292 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 218 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 215 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 228 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 283384 KB Output is correct
2 Correct 118 ms 283216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 202 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 227 ms 524288 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -