感觉这题就像是在判断给你的这个图是不是半欧拉图,
判断图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;
}