7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)

简介: 7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)

7-57 愿天下有情人都是失散多年的兄妹 (25 分)


呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?


输入格式:


输入第一行给出一个正整数N(2 ≤ N ≤104),随后N行,每行按以下格式给出一个人的信息:


本人ID 性别 父亲ID 母亲ID


其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。


接下来给出一个正整数K,随后K行,每行给出一对有情人的ID,其间以空格分隔。


注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。


输出格式:


对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出Never Mind;如果是异性并且关系出了五服,输出Yes;如果异性关系未出五服,输出No


输入样例:


24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011


输出样例:


1. Never Mind
2. Yes
3. Never Mind
4. No
5. Yes
6. No
7. Yes
8. No
9. No


鸣谢用户 徐校波 修正数据!


#include<bits/stdc++.h>
using namespace std;
#define N 100010
vector<int>g[N];//邻接表
int n ,vis[N] ,flag ,x ,fa ,ma;
char c , sex[N];
void dfs (int x ,int n) {
    if(n > 4) return ;
    for (int i = 0; i < g[x].size(); i++) {
        if (vis[g[x][i]] == 0) {
            vis[g[x][i]] = 1;
            dfs(g[x][i] ,n + 1);
        }
        else 
            flag = 1;
    }
}
int main() {
    cin >> n;
    while (n--) {
        cin >> x >> c >> fa >> ma;
        sex[x] = c;
        if (fa != -1) {
            g[x].push_back(fa);
            sex[fa] = 'M';
        }
        if (ma != -1) {
            g[x].push_back(ma);
            sex[ma] = 'F';
        }
    }
    cin >> n; 
    while (n--) {
        int a ,b;  cin >> a >> b;
        if (sex[a] == sex[b]) 
            cout << "Never Mind" << endl;
        else {
            fill(vis ,vis + N ,0);
            vis[a] = 1 ,vis[b] = 1 ,flag = 0;
            dfs (a ,1) ,dfs(b ,1);
            if (flag) cout << "No" << endl;
            else cout << "Yes" << endl;
        }
    }
    return 0;
}
目录
相关文章
|
10月前
|
算法 测试技术 C++
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
C++二分算法习题:判断是否是完全平方数[容易]和排列箱子[容易]
|
2月前
1056 组合数的和 (15 分)
1056 组合数的和 (15 分)
|
3月前
|
机器学习/深度学习 算法 测试技术
【单调栈】LeetCode:2818操作使得分最大
【单调栈】LeetCode:2818操作使得分最大
(二分)1227. 分巧克力
(二分)1227. 分巧克力
66 0
|
机器学习/深度学习 Java
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
每个数字有两种状态,删除或者未删除,因此可以使用状态压缩记录未删除的数字情况state,便于使用位运算进行状态的遍历及转移;使用状态压缩dp找到将所以数字删除的最大分数
92 0
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
L3-008 喊山 (30 分)(bfs)
L3-008 喊山 (30 分)(bfs)
93 0
L3-008 喊山 (30 分)(bfs)
|
存储
L2-031 深入虎穴 (25 分)(bfs)
L2-031 深入虎穴 (25 分)(bfs)
196 0
L2-031 深入虎穴 (25 分)(bfs)
|
存储 算法 C语言
6-1 最小生成树(普里姆算法) (10分)
6-1 最小生成树(普里姆算法) (10分)
6-1 最小生成树(普里姆算法) (10分)
L2-026 小字辈 (25 分)(bfs)
L2-026 小字辈 (25 分)(bfs)
117 0
L2-013 红色警报 (25 分)(并查集)
L2-013 红色警报 (25 分)(并查集)
174 0