题目链接
解题思路:
傻叉了 拿并查集写的 正解应该是 dfs
代码如下:
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=1e5+10;
vector<int> v[maxn];
bool vis[maxn];//记录亲属
int a[maxn];//记录性别
bool flag;//判断是否可以是情侣
void dfs(int x,int num)
{
if(num>=4)//超出五服
return;
for(int i=0;i<v[x].size();i++)
{
if(!vis[v[x][i]])//没出现
{
vis[v[x][i]]=1;//标记下来
dfs(v[x][i],num+1);
}
else
{
flag=1;//这个亲戚出现过了
return;//这个return 加不加都行 加了少39ms
}
}
}
int main()
{
int n,i,j,d,x,y,k,m;
char c;
cin>>n;
while(n--)
{
cin>>d;
cin>>c;
cin>>x>>y;
if(c=='M')
a[d]=2;
if(c=='F')
a[d]=1;
if(x!=-1)
{
v[d].push_back(x);//d的父亲是x
a[x]=2; //记得把父亲的性别标记下来
}
if(y!=-1)
{
v[d].push_back(y);//d的母亲是y
a[y]=1; //记得把母亲的性别标记下来
}
}
cin>>m;
while(m--)
{
cin>>x>>y;
if(a[x]==a[y])
{
cout<<"Never Mind"<<endl;
continue;
}
else
{
memset(vis,0,sizeof(vis));
flag=false;
vis[x]=1;vis[y]=1;
dfs(x,0);
dfs(y,0);
if(flag)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
return 0;
}