WA90,求大佬
查看原帖
WA90,求大佬
56545
盼君勿忘楼主2021/9/7 00:15
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;

typedef pair<int, int> pii;
const int maxn = 11, maxm = (1 << 10) + 5;

struct Node {
	int x, y, s;
} path[maxn][maxn][maxm];

int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int n, m, k, G[maxn][maxn];

int dp[maxn][maxn][maxm];

int inq[maxn][maxn];
queue<pii> q;

void spfa(int s) {
	while (!q.empty()) {
		auto [x, y] = q.front(); q.pop();
		inq[x][y] = false;
		for (int i = 0; i < 4; i++) {
			int xx = x + dx[i], yy = y + dy[i];
			if (xx < 1 || xx > n || yy < 1 || yy > m) continue;
			if (dp[xx][yy][s] > dp[x][y][s] + G[xx][yy]) {
				dp[xx][yy][s] = dp[x][y][s] + G[xx][yy];
				path[xx][yy][s] = {x, y, s};
				if (!inq[xx][yy]) { q.push({xx, yy}); inq[xx][yy] = 1; }
			}
		}
	}	
}

int vis[maxn][maxn];

void dfs(int x, int y, int s) {
	if (path[x][y][s].s == 0) return;
	vis[x][y] = true;
	auto [xx, yy, ss] = path[x][y][s];
	dfs(xx, yy, ss);
	if (xx == x && yy == y) dfs(xx, yy, ss ^ s);
}

inline void init() {
	memset(dp, 0x3f, sizeof(dp));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	init();
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> G[i][j];
			if (G[i][j] == 0) {
				dp[i][j][1 << k] = 0;
				k += 1;
			}
		}
	}
	for (int s = 1; s < (1 << k); s++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				for (int k = s & (s - 1); k; k = (k - 1) & s) {
					if (dp[i][j][s] > dp[i][j][k] + dp[i][j][s ^ k] - G[i][j]){
						dp[i][j][s] = dp[i][j][k] + dp[i][j][s ^ k] - G[i][j];
						path[i][j][s] = {i, j, k};
					}
				}
				if (dp[i][j][s] < inf) { q.push({i, j}); inq[i][j] = 1; }
			}
		}
		spfa(s);
	}
	int i = 1, j = 1;
	for (i = 1; i <= n; i++) {
		for (j = 1; j <= m; j++) {
			if (G[i][j] == 0) break;
		}
		if (G[i][j] == 0) break;
	}
	cout << dp[i][j][(1 << k) - 1] << endl;
	dfs(i, j, (1 << k) - 1);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (G[i][j] == 0) cout << 'x';
			else if (vis[i][j]) cout << 'o';
			else cout << '_';
		}
		cout << endl;
	}
	return 0;
}
2021/9/7 00:15
加载中...