wa 90pts求助
查看原帖
wa 90pts求助
799782
xiaochen266楼主2024/4/27 22:36

最后一个点WA调了半小时了

#include <bits/stdc++.h>
using namespace std;
const int N = 3e3 + 10;

struct node {
	int nt, to, val;
} edge[N * 10];
int head[N], tot = 1;

void add(int u, int v, int w) {
	edge[++tot] = {head[u], v, w};
	head[u] = tot;
	swap(u, v);
	edge[++tot] = {head[u], v, 0};
	head[u] = tot;
}

int tu[50][50];
char T[50][50];
int r, c, d;
int id[50][50], cnt;
int s, t, n;

int dis[N], now[N];
bool bfs() {
	for (int i = 1; i <= n * 2 + 2; i++) {
		dis[i] = 2e9;
	}
	queue<int> q;
	q.push(s);
	dis[s] = 0;
	now[s] = head[s];
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (int i = head[u]; i; i = edge[i].nt) {
			int v = edge[i].to;
			if (edge[i].val > 0 && dis[v] == 2e9) {
				q.push(v);
				dis[v] = dis[u] + 1;
				now[v] = head[v];
				if (v == t)
					return 1;
			}
		}
	}
	return 0;
}

int dfs(int u, int sum) {
	if (u == t)
		return sum;
	int k = 0, res = 0;
	for (int i = now[u]; i; i = edge[i].nt) {
		now[u] = i;
		int v = edge[i].to;
		if (edge[i].val > 0 && (dis[v] == dis[u] + 1)) {
			k = dfs(v, min(sum, edge[i].val));
			edge[i].val -= k;
			edge[i ^ 1].val += k;
			res += k;
			sum -= k;
		}
	}
	return res;
}

int main() {
	int sum = 0;
	cin >> r >> c >> d;
	n = r * c;
	s = n * 2 + 1, t = n * 2 + 2;
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			char a;
			cin >> a;
			id[i][j] = ++cnt;
			tu[i][j] = a - '0';
		}
	}
	for (int i = 1; i <= r; i++)
		for (int j = 1; j <= c; j++)
			cin >> T[i][j];
	for (int i = 1; i <= r; i++) {
		for (int j = 1; j <= c; j++) {
			add(id[i][j], id[i][j] + n, tu[i][j]);
			if (T[i][j] == 'L') {
				add(s, id[i][j], 1);
				sum++;
			}
			for (int di = -d; di <= d; di++) {
				for (int dj = -d; dj <= d; dj++) {
					if (abs(di) + abs(dj) > d)
						continue;
					int x = i + di, y = j + dj;
					if (x < 1 || x > r || y < 1 || y > c)
						add(id[i][j] + n, t, 2e9);
					else if (tu[x][y])
						add(id[i][j] + n, id[x][y], 2e9);
				}
			}
		}
	}
	int ans = 0;
	while (bfs())
		ans += dfs(s, 2e9);
	cout << sum - ans;
	return 0;
}
2024/4/27 22:36
加载中...