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

思路

这题我还以为是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\n");
            continue;
        }
        dfs(v1,k,1);
        dfs(v2,k,1);
        if (flag) {
            printf("Yes\n");
        }
        else {
            printf("No\n");
        }
    }
    return 0;
}


数据

/*
2
1 m 10001 10002
2 f 10003 10004
3
10001 10002
10003 10002
10002 10004
*/
posted @ 2020-02-19 17:05  xyee  阅读(362)  评论(0编辑  收藏  举报