zoukankan      html  css  js  c++  java
  • 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
    ");
                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
    */
    
  • 相关阅读:
    [转]常用数字处理算法的Verilog实现
    [转]Linux必学的60个命令
    [转]4位超前进位加法器代码及原理
    [转]FPGA & Verilog开发经验若干
    [转]Verilog中parameter和define的区别
    [转]VIM标记 mark 详解
    关于获取服务的需求列表
    Office 2007 探索之路 Outlook
    利用反射建立单一调用的WebService
    寻宝记
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12332011.html
Copyright © 2011-2022 走看看