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

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

在这里插入图片描述

输入样例

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

输出样例

Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No

代码

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int Inf=1e5+5;
int n,m;//结点数,测试样例数
bool flag;//标记情侣是否为近亲
vector<int> v[Inf];//下标为人物编号,值为这个人的双亲结点的编号
char sex[Inf];//下标为人物编号,值表示这个人的性别
bool vis[Inf];//下标为人物编号,值表示这个人是否被访问过(是否是五代以内亲属)
void dfs(int info,int num){//num表示第几代,初始化为0
    //递归边界1:超过五代
    if (num == 4){
        return;
    }
    //如果结点info的父、母结点没有被访问过,则dfs之;反之则说明五代以内出现近亲,置flag为1
    for(int i=0;i<v[info].size();i++){
        if(!vis[v[info][i]]){
            vis[v[info][i]]=1;
            dfs(v[info][i],num+1);
        }else{
            flag=1;//五代以内出现了近亲,置flag为1
        }
    }  
}
int main(){
    //读入关系图
    cin >> n;
    while(n--){
        int tinfo, tfatinfo, tmoninfo;
        char tsex;
        cin>>tinfo>>tsex>>tfatinfo>>tmoninfo;
        sex[tinfo]=tsex;//记录自身的性别
        if(tfatinfo!=-1)//-1不用保存,避免数据处理不当导致数组越界 
		{
			v[tinfo].push_back(tfatinfo);//保存父亲编号 
			sex[tfatinfo]='M';//记录父亲性别 
		}
		if(tmoninfo!=-1)
		{
			v[tinfo].push_back(tmoninfo);
			sex[tmoninfo]='F';
        }
    }
    //读入测试样例
    cin >> m;
    while(m--){
        int tinfo1, tinfo2;
        cin >> tinfo1 >> tinfo2;
        if(sex[tinfo1]==sex[tinfo2]){
            cout << "Never Mind" << endl;
        }else{
            memset(vis, 0, sizeof(vis));
            flag = 0;
            vis[tinfo1] = 1;
            vis[tinfo2] = 1;
            dfs(tinfo1, 0);
            dfs(tinfo2, 0);
            if(flag){
                cout << "No" << endl;
            }else{
                cout << "Yes" << endl;
            }
        }

    }
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值