zju 2100 Seeding(dfs暴搜)

感觉这题就像是在判断给你的这个图是不是半欧拉图,

判断图G是欧拉图当且仅当G为连通图,且所有点度为偶数。

判断图G是半欧拉图当且仅当G为连通图,且当且仅当2个点度数为奇数。

欧拉图也是半欧拉图。

但是,从里理论上来说,可以做出来,还要用并查集判断是否连接,感觉繁了点,不过,时间应该要比DFS的少,速度要快。

但是由于本来很懒,很懒,所以只是提出建议,可以这样做,自己做了一下,感觉可以,就不做了。

附上DFS代码:

#include<iostream>
#include<cstring>
using namespace std;

#define MAX_N 10

char map[MAX_N][MAX_N];
bool use[MAX_N][MAX_N],succeed;
int n,m,numstones,numseed;

void Init(){

	memset(map,'S',sizeof(map));
	memset(use,false,sizeof(use));

	numstones=0;
	succeed=false;

	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>map[i][j];
			if(map[i][j]=='S')
				numstones++;
		}
	numseed=n*m-numstones;
}
bool dfs(int x,int y,int k){	
	
	if(map[x][y]=='S' || use[x][y])
		return false;
	use[x][y]=true;

	if(succeed || k==1 || dfs(x+1,y,k-1)||
		dfs(x-1,y,k-1)||dfs(x,y+1,k-1)||dfs(x,y-1,k-1)){
		succeed=true;
		return true;
	}
	use[x][y]=false;
	return false;
}
int main(){
	while(cin>>n>>m && n&& m){
		Init();	
		dfs(1,1,numseed)?cout<<"YES"<<endl:cout<<"NO"<<endl;
	}
	return 0;
}


你可能感兴趣的:(zju 2100 Seeding(dfs暴搜))