题解说写tarjan,但是我觉得只有高度相同才会出现强联通分量,然后我用dfs直接找联通块,是题解有误还是数据过水?
以下是我Ac代码:
#include<bits/stdc++.h>
using namespace std;
const int N=505;
template <typename T> inline void read(T &x) {
x = 0; char ch = getchar(); int f = 1;
while (!isdigit(ch) && ch ^ '-') ch = getchar();
if (ch == '-') f = -1, ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar(); x *= f;
}
int n,m,a[N][N],rep[N][N],idx,cni,cnt;
bool in[N*N],out[N*N];
void dfs(int x,int y,int rp){
rep[x][y]=rp;
if(x-1>0&&a[x-1][y]==a[x][y]&&!rep[x-1][y]) dfs(x-1,y,rp);
if(x+1<=n&&a[x+1][y]==a[x][y]&&!rep[x+1][y]) dfs(x+1,y,rp);
if(y-1>0&&a[x][y-1]==a[x][y]&&!rep[x][y-1]) dfs(x,y-1,rp);
if(y+1<=m&&a[x][y+1]==a[x][y]&&!rep[x][y+1]) dfs(x,y+1,rp);
}
void Add(int x,int y,int x1,int y1){
if(a[x][y]<a[x1][y1]){
in[rep[x][y]]=1;
out[rep[x1][y1]]=1;
}if(a[x][y]>a[x1][y1]){
in[rep[x1][y1]]=1;
out[rep[x][y]]=1;
}
}
int main(){
read(n),read(m);
swap(n,m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
read(a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!rep[i][j]) dfs(i,j,++idx);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(i>1) Add(i,j,i-1,j);
if(i<n) Add(i,j,i+1,j);
if(j>1) Add(i,j,i,j-1);
if(j<m) Add(i,j,i,j+1);
}
if(idx==1){
puts("0");
return 0;
}
for(int i=1;i<=idx;i++){
cni+=!in[i];
cnt+=!out[i];
}
printf("%d",max(cni,cnt));
return 0;
}