思路
这题我还以为是lca呢,写了好长时间,想来想去。
而且题目的意思我也没弄明白,题中也没有说如果两个人的姥姥是同一个人,能不能结婚,题中只说了本人、父母、祖父母、曾祖父母、高祖父母 这一系下的不能通婚。
不是很懂这是啥意思,后来去查了查百度百科
祖父母,法律上,是指父亲的父母。由于男女平等,父母的父母生活中都可以称之为“祖父母”。
不过以前母亲的父母会被称之为“外祖父母”。
就是呀,以前是叫外祖父母,这个把我搞得很糊涂。
我还一直在考虑lca,结果这题是图的染色问题,题中有个细节要注意一下:
- 对于染色的颜色不能等于0,因为vis数组初始值为0,这样会错(可以把vis染成-1,这样就可以用0来染色了,而且每次还不用初始化,直接染色就可以了)
- 对于每一个出现的人都应该标记他们的性别,这样对于没有说明父母是谁的人也可以判断是否可以结婚。否则会WA第2个点。
时间复杂度
每次搜索顶多搜索25+25 -1 ,即63个节点,这样时间复杂度很小
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int fa[maxn],mom[maxn],vis[maxn];
char sex[maxn];
int flag=1;
void dfs(int id,int color,int cnt) {
if (cnt>5||id==-1||!flag) {
return;
}
if (vis[id]==color) {
flag=0;
return ;
}
vis[id]=color;
dfs(fa[id],color,cnt+1);
dfs(mom[id],color,cnt+1);
}
int main()
{
int n;
int id,f,m;
char sx;
scanf("%d",&n);
memset(mom,-1,sizeof(mom));
memset(fa,-1,sizeof(fa));
memset(vis,-1,sizeof(vis));
while (n--) {
scanf("%d %c %d %d",&id,&sx,&f,&m);
sex[f]='M';
sex[m]='F';
fa[id]=f;
mom[id]=m;
sex[id]=sx;
}
int k;
int v1,v2;
scanf("%d",&k);
while (k--) {
scanf("%d%d",&v1,&v2);
flag=1;
if (sex[v1]==sex[v2]) {
printf("Never Mind
");
continue;
}
dfs(v1,k,1);
dfs(v2,k,1);
if (flag) {
printf("Yes
");
}
else {
printf("No
");
}
}
return 0;
}
数据
/*
2
1 m 10001 10002
2 f 10003 10004
3
10001 10002
10003 10002
10002 10004
*/