求助割点为什么是错的
  • 板块CF377A Maze
  • 楼主yhylivedream
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/20 21:20
  • 上次更新2024/5/21 09:42:51
查看原帖
求助割点为什么是错的
778022
yhylivedream楼主2024/5/20 21:20

WA on test 11

//author : yhy
#include <bits/stdc++.h> 

using namespace std;
using LL = long long;
using Pii = pair<int, int>;

const int kMaxN = 505, kMaxM = kMaxN * kMaxN, kD[][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};

int n, m, k, r, idx, cut[kMaxM], dfn[kMaxM], low[kMaxM];
vector<int> e[kMaxM];
char c[kMaxN][kMaxN];

void T(int x) {
  dfn[x] = low[x] = ++idx;
  int fl = 0;
  for (int nxt : e[x]) {
    if (!dfn[nxt]) {
      T(nxt), low[x] = min(low[x], low[nxt]);
      low[x] >= dfn[nxt] && (fl++, cut[x] |= (x != r || fl > 1));
    } else {
      low[x] = min(low[x], dfn[nxt]);
    }
  }
}
int G(int x, int y) {
  return (x - 1) * m + y;
}

signed main() {
  cin.tie(0)->ios::sync_with_stdio(0), cin >> n >> m >> k;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> c[i][j];
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (c[i][j] != '#') {
        for (int x = 0; x < 4; x++) {
          int nx = i + kD[x][0], ny = j + kD[x][1];
          nx >= 1 && ny >= 1 && nx <= n && ny <= m && c[nx][ny] != '#' && (e[G(i, j)].push_back(G(nx, ny)), 0);
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      c[i][j] != '#' && (r = G(i, j), T(r), 0);
    }
  }
  for (int i = 1; i <= n; cout << '\n', i++) {
    for (int j = 1; j <= m; j++) {
      if (c[i][j] == '.') {
        if (k && !cut[G(i, j)]) {
          cout << 'X', k--;
        } else {
          cout << '.';
        }
      } else {
        cout << '#';
      }
    }
  }
  return 0;
}
2024/5/20 21:20
加载中...