L2-016 愿天下有情人都是失散多年的兄妹 (25 分)
#include<bits/stdc++.h>
using namespace std;
int fa[100000];
int ma[100000];
int sex[100000];
bool dfs(int a,int b,int cnt)
{
if(a==-1||b==-1)return 1;
if(ma[a]!=-1&&ma[a]==ma[b])return 0;
if(fa[a]!=-1&&fa[a]==fa[b])return 0;
cnt++;
if(cnt>=4)
{
return 1;
}
return dfs(fa[a],fa[b],cnt)&&dfs(ma[a],fa[b],cnt)&&dfs(ma[a],ma[b],cnt)&&dfs(fa[a],ma[b],cnt);
}
int main()
{
int n;
cin>>n;
memset(fa,-1,sizeof fa);
memset(ma,-1,sizeof ma);
for(int i=1; i<=n; i++)
{
int a,fa1,ma1;
char mm[3];
cin>>a>>mm>>fa1>>ma1;
if(mm[0]=='M')
{
sex[a] = 0;
}
else sex[a] = 1;
if(fa1!=-1)
{
sex[fa1] = 0;
fa[a] = fa1;
}
if(ma1!=-1)
{
sex[ma1] =1;
ma[a] = ma1;
}
}
int k;
cin>>k;
for(int i=1; i<=k; i++)
{
int aa,bb;
cin>>aa>>bb;
int f = dfs(aa,bb,0);
if(sex[aa]==sex[bb])printf("Never Mind\n");
else if(f)printf("Yes\n");
else printf("No\n");
}
return 0;
}
CODE2
#include<iostream>
#include<string.h>
#define MAX 100010
using namespace std;
int father[MAX],mother[MAX];
typedef struct Man
{
char sex;
int fa,mo;
};
Man man[MAX];
int Find(int a,int b,int num)
{
if(a == -1 || b == -1)
return 1;
if((mother[a] != -1 && mother[a] == mother[b]) || (father[a] != -1 && father[a] == father[b]))
return 0;
num++;
if(num >= 4)
return 1;
return (Find(mother[a],mother[b],num) && Find(mother[a],father[b],num) && Find(father[a],father[b],num) && Find(father[a],mother[b],num));
}
int main()
{
memset(father,-1,sizeof(father));
memset(mother,-1,sizeof(mother));
int n,m;
cin >> n;
for(int i = 0;i < n; i++)
{
int a;
cin >> a;
cin >> man[a].sex >> man[a].fa >> man[a].mo;
if(man[a].fa != -1)
{
father[a] = man[a].fa;
man[man[a].fa].sex = 'M';//父母的性别没有设置,需要手动设置
}
if(man[a].mo != -1)
{
mother[a] = man[a].mo;//父母的性别没有设置,需要手动设置
man[man[a].mo].sex = 'F';
}
if(man[a].fa == -1)
father[a] = -1;
if(man[a].mo == -1)
mother[a] = -1;
}
cin >> m;
for(int i = 0;i < m; i++)
{
int a,b;
cin >> a >> b;
if(man[a].sex == man[b].sex)
cout <<"Never Mind"<<endl;
else
{
int num = 0;
if(Find(a,b,num))
cout <<"Yes"<<endl;
else
cout <<"No"<<endl;
}
}
return 0;
}