Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
119019 | 陈家宝 | 最小生成树 (mst) | C++ | 解答错误 | 10 | 5 MS | 432 KB | 2295 | 2024-01-03 13:23:36 |
#include<bits/stdc++.h> using namespace std; const int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; int n,m,a[55][55],vis[55][55]; vector<pair<int, int> > g[3]; bool check(int x, int y){ return x > 0 && x <= n && y > 0 && y <= m; } void dfs1(int x, int y, int c){ vis[x][y] = c + 1; g[c].push_back(make_pair(x, y)); for(int i = 0; i < 4; i++){ int nx = x + dx[i], ny = y + dy[i]; if(check(nx, ny) && a[nx][ny] && !vis[nx][ny])dfs1(nx, ny, c); } } int getj(int xx, int yx, int xy, int yy){ return abs(xx - xy) + abs(yx - yy); } int sb[55][55][3]; int main() { scanf("%d%d", &n, &m); for(int i = 1; i<= n; i++){ for(int j = 1; j <= m; j++){ char c; scanf("%c", &c); if(c == 'X')a[i][j] = 1; else a[i][j] = 0; } } int cnt = 0; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++) if(a[i][j] && !vis[i][j])dfs1(i, j, cnt++); } memset(sb, 0x3f, sizeof(sb)); for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ for(int c = 0; c < 3; c++){ for(int k = 0; k < g[c].size(); k++) sb[i][j][c] = min(sb[i][j][c], getj(i, j, g[c][k].first, g[c][k].second)); } } } // for(int c = 0; c < 3; c++){ // for(int i = 1; i <= n; i++){ // for(int j = 1; j <= m; j++) // printf("%3d ", sb[i][j][c]); // printf("\n"); // } // printf("\n"); // } int ans = 0x3f3f3f3f; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++) ans = min(ans, sb[i][j][0] + sb[i][j][1] + sb[i][j][2] - 2); } for(int c = 0; c < 3; c++){ int a1 = 0x3f3f3f3f, a2 = 0x3f3f3f3f; if(c == 0){ for(int k = 0; k < g[c].size(); k++) a1 = min(a1, sb[g[c][k].first][g[c][k].second][1]); for(int k = 0; k < g[c].size(); k++) a2 = min(a2, sb[g[c][k].first][g[c][k].second][2]); } else if(c == 1){ for(int k = 0; k < g[c].size(); k++) a1 = min(a1, sb[g[c][k].first][g[c][k].second][0]); for(int k = 0; k < g[c].size(); k++) a2 = min(a2, sb[g[c][k].first][g[c][k].second][2]); } else if(c == 2){ for(int k = 0; k < g[c].size(); k++) a1 = min(a1, sb[g[c][k].first][g[c][k].second][0]); for(int k = 0; k < g[c].size(); k++) a2 = min(a2, sb[g[c][k].first][g[c][k].second][1]); } ans = min(ans, a1 + a2 - 2); } printf("%d", ans); return 0; }