2020-team3-012
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
#include <bits/stdc++.h>
using namespace std;
int n, m;
char s[2005][2005];
int id[2005][2005], idx;
int g[4000005][5];
int vis[4000005], low[4000005], dfn[4000005], num, cnt;
void add(int x, int y) {
g[x][++ g[x][0]] = y;
g[y][++ g[y][0]] = x;
}
int tmp[4000005];
int main() {
#ifndef ONLINE_JUDGE
freopen("G.in", "r", stdin);
#endif
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++)
scanf("%s", s[i] + 1);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (s[i][j] == '.')
id[i][j] = ++ idx;
const int dx[4] = {0, +1};
const int dy[4] = {+1, 0};
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (s[i][j] == '.') {
for (int k = 0; k < 2; k ++) {
int ni = i + dx[k], nj = j + dy[k];
if (1 <= ni && ni <= n && 1 <= nj && nj <= m && s[ni][nj] == '.')
add(id[i][j], id[ni][nj]);
}
}
for (int i = 1; i <= idx; i ++)
if (vis[i] == 0) {
cnt ++;
stack<pair<int, int> > stk;
stk.push(make_pair(i, 0));
while (!stk.empty()) {
int x = stk.top().first, pr = stk.top().second;
if (vis[x] == 0) {
vis[x] = 1, low[x] = dfn[x] = ++ num;
tmp[x] = -1;
if (pr)
tmp[x] ++;
for (int k = 1; k <= g[x][0]; k ++) {
int y = g[x][k];
if (y != pr) {
if (vis[y] == 0)
stk.push(make_pair(y, x));
else if (vis[y] == 1)
low[x] = min(low[x], dfn[y]);
}
}
}
else if (vis[x] == 1) {
stk.pop();
vis[x] = 2;
if (pr) {
low[pr] = min(low[pr], low[x]);
tmp[pr] += 1;
if (low[x] < dfn[pr])
tmp[pr] -= 1;
}
}
else if (vis[x] == 2)
stk.pop();
}
}
printf("%d\n", cnt + *max_element(tmp + 1, tmp + idx + 1));
return 0;
}
#include
using namespace std;
int n, m;
char s[2005][2005];
int id[2005][2005], idx;
int g[4000005][5];
int vis[4000005], low[4000005], dfn[4000005], num, cnt;
void add(int x, int y) {
g[x][++ g[x][0]] = y;
g[y][++ g[y][0]] = x;
}
int tmp[4000005];
int main() {
#ifndef ONLINE_JUDGE
freopen("G.in", "r", stdin);
#endif
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++)
scanf("%s", s[i] + 1);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (s[i][j] == '.')
id[i][j] = ++ idx;
const int dx[4] = {0, +1};
const int dy[4] = {+1, 0};
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
if (s[i][j] == '.') {
for (int k = 0; k < 2; k ++) {
int ni = i + dx[k], nj = j + dy[k];
if (1 <= ni && ni <= n && 1 <= nj && nj <= m && s[ni][nj] == '.')
add(id[i][j], id[ni][nj]);
}
}
for (int i = 1; i <= idx; i ++)
if (vis[i] == 0) {
cnt ++;
stack
stk.push(make_pair(i, 0));
while (!stk.empty()) {
int x = stk.top().first, pr = stk.top().second;
if (vis[x] == 0) {
vis[x] = 1, low[x] = dfn[x] = ++ num;
tmp[x] = -1;
if (pr)
tmp[x] ++;
for (int k = 1; k <= g[x][0]; k ++) {
int y = g[x][k];
if (y != pr) {
if (vis[y] == 0)
stk.push(make_pair(y, x));
else if (vis[y] == 1)
low[x] = min(low[x], dfn[y]);
}
}
}
else if (vis[x] == 1) {
stk.pop();
vis[x] = 2;
if (pr) {
low[pr] = min(low[pr], low[x]);
tmp[pr] += 1;
if (low[x] < dfn[pr])
tmp[pr] -= 1;
}
}
else if (vis[x] == 2)
stk.pop();
}
}
printf("%d\n", cnt + *max_element(tmp + 1, tmp + idx + 1));
return 0;
}