因为人的id都是整数,所以这道题可以离散化,也可以不离散化,在此给出两种方式的代码:
非离散化代码:
#include<bits/stdc++.h>
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
//
const int N=1e5+5;
char c[N];
vector<int> v[N];
int n,flag=0;
int vis[N];
void dfs(int num,int dep){
if(dep>=4)return ;
for(int i=0;i<v[num].size();i++){
if(!vis[v[num][i]]){
vis[v[num][i]]=1;
dfs(v[num][i],dep+1);
}
else {
flag=1;
return ;
}
}
}
int main(){
cin>>n;
f(i,0,n){
int t,fa,ma;
cin>>t;
cin>>c[t];
cin>>fa>>ma;
if(fa!=-1){
v[t].push_back(fa);
c[fa]='M';
}
if(ma!=-1){
v[t].push_back(ma);
c[ma]='F';
}
}
cin>>n;
f(i,0,n){
int t1,t2;
cin>>t1>>t2;
if(c[t1]==c[t2]){
cout<<"Never Mind"<<endl;
continue;
}
memset(vis,0,sizeof vis);
//下面2行可写可不写
// vis[t1]=1;
// vis[t2]=1;
flag=0;
dfs(t1,0);
dfs(t2,0);
if(!flag)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
离散化代码:
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
const int N=1e5+5;
vector<int> v[N];
map<int,string> mp1;
map<string,int> mp2,sx;
int n,cnt=0;
int st[N];
int flag=0;
void dfs(int x,int dep){
if(dep>4)return ;
f(i,0,v[x].size()){
if(!st[v[x][i]]){
dfs(v[x][i],dep+1);
st[v[x][i]]=1;
}
else{
flag=1;
}
}
}
int main(){
cin>>n;
f(i,0,n){
string s1,s2,s3;
char c;
cin>>s1>>c>>s2>>s3;
if(!mp2[s1]){
cnt++;
mp2[s1]=cnt;
mp1[cnt]=s1;
//男为1,女为0
if(c=='M')sx[s1]=1;
else sx[s1]=0;
}
if(s2!="-1"){
if(!mp2[s2]){
cnt++;
mp2[s2]=cnt;
mp1[cnt]=s2;
sx[s2]=1;
// 错误示范
// v[mp2[s1]].push_back(cnt);
}
v[mp2[s1]].push_back(mp2[s2]);
}
if(s3!="-1"){
if(!mp2[s3]){
cnt++;
mp2[s3]=cnt;
mp1[cnt]=s3;
sx[s3]=0;
// 错误示范
// v[mp2[s1]].push_back(cnt);
}
v[mp2[s1]].push_back(mp2[s3]);
}
}
int p;cin>>p;
f(i,0,p){
memset(st,0,sizeof st);
string s1,s2;
cin>>s1>>s2;
if(sx[s1]==sx[s2]){
cout<<"Never Mind"<<endl;
}
else{
flag=0;
dfs(mp2[s1],1);
dfs(mp2[s2],1);
if(!flag)cout<<"Yes";
else cout<<"No";
cout<<endl;
}
}
return 0;
}