7-42.png
7-42-2.png
分析
这道题是一道DFS,只需要在两个判断点之间做两遍dfs,因为是一个树形结构,所以不需要进行visit标记防止回溯。
但是这道题里面的visit是标志所有的祖先,只要两次遍历之后,祖先要是有重复,那么就输出yes!
最近在写代码的过程中出现很多小错误的细节,比如在全局定义了int flag ,在局部里面有定义了一遍int flag,导致局部不可用等细节!写代码的时候得注意!
ac代码
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
char gender[maxn];
int visit[maxn];
vector<int> vec[maxn];
int flag=0;
void dfs(int n,int num){
if(num>=4)
return;
visit[n]=1;
for(int i=0;i<vec[n].size();i++){
if(!visit[vec[n][i]]){
visit[vec[n][i]]=1;
dfs(vec[n][i],num+1);
}
else{
flag=1;
}
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int a,c,d;char b;
cin>>a>>b>>c>>d;
gender[a]=b;
if(c!=-1){
vec[a].push_back(c);
gender[c]='M';
}
if(d!=-1){
vec[a].push_back(d);
gender[d]='F';
}
//存图
}
int m;
cin>>m;
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
if(gender[x]==gender[y]){
cout<<"Never Mind"<<endl;
continue;
}
flag=0;
memset(visit,0,sizeof(visit));
dfs(x,0);
dfs(y,0);
if(flag==1){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
}
}