L2-016 愿天下有情人都是失散多年的兄妹

#include <bits/stdc++.h>
using namespace std;
#define int long long 
using pii=pair<int,int>;

char sex[100005];

vector<int>tr[100005];

bool vis[100005];
bool flag;
void dfs(int x,int dep)
{
    if(dep>5) return ;
    vis[x]=1;
    for(auto i:tr[x]){
        if(!vis[i]){
            dfs(i,dep+1);
        }else{
            flag=1;
        }
    }
    
}

void solve()
{
    //思路:建完树以后,第一个人先把其五代内的亲戚都标记了一遍
    //如果第二个人 遍历的时候再次走到这个已经被标记的亲戚,说明这是在其五代内,那就说明其不能结婚
    //不用往lca(最近公共祖先)上想,因为你只需判断两人的五代亲戚中有无相同即可
    
    int n; cin>>n;
    for(int i=0;i<n;i++)
    {
        int id,fa,mu;
        char xb;
        cin>>id>>xb>>fa>>mu;
        sex[id]=xb;
        if(fa!=-1)    tr[id].push_back(fa), sex[fa]='M';//因为也可能询问父母 所以需要记录
        if(mu!=-1)    tr[id].push_back(mu),sex[mu]='F';
    }
    
    
    int q; cin>>q;
    while(q--)
    {
        int a,b;
        cin>>a>>b;
        if(sex[a]==sex[b]) cout<<"Never Mind\n";
        else{
            memset(vis,0,sizeof vis);
            flag=0;
            
            dfs(a,1);
            dfs(b,1);
           // cout<<flag<<" ";
            
            if(flag ) cout<<"No\n";
            else cout<<"Yes\n";
        }
        
        
        
    }
    
    
    
    
    
}




signed main()
{
    int t=1;
    //cin>>t;
    while(t--) solve();
    
    
}

posted on 2025-04-06 16:12  swj2529411658  阅读(20)  评论(0)    收藏  举报

导航