题解都写的什么玩意?
查看原帖
题解都写的什么玩意?
705012
Miss_SGT楼主2023/8/15 16:23

题解说写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;
}

2023/8/15 16:23
加载中...