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

2
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

这个题一做做一下午。就是进行两遍dfs,第一遍把第一个人的五服亲属标记,第二遍看看第二个人的五服亲属是否已被标记过。若被标记过则没出五服。

需要注意的是:每次输入的时候都需要把父亲和母亲的性别更新一下,因为,当一个人的父亲或者母亲的信息没有在下面的数据给出,那么这个人的父亲和母亲的性别就会没有被保存。如果测试数据中要求你回答这个人父亲或者他的母亲是否可以和别人成为情侣时,就会无法判断这两个人是否是同性还是异性,那么就会有错。参考cp0328

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 1e5 + 10;
int n,k;
struct node
{
    int id,fa = -1,ma = -1;
    char g;
}a[maxn];
int vis[maxn];
bool sign;
void dfs(int x,int d)
{
//    printf("%d %d %d\n",x,vis[x],d);
    if(vis[x] > 1) sign = true;
    if(d > 3 || sign) return;
    int fx = a[x].fa;
    int mx = a[x].ma;
//    printf("%d %d\n",fx,mx);
    if(fx != -1)
    {
        vis[fx]++;
        dfs(fx,d + 1);
    }
    if(sign) return;
    if(mx != -1)
    {
        vis[mx]++;
        dfs(mx,d + 1);
    }
}
int main()
{
    int x,fx,mx,y;
    char gx;
    cin>>n;
    for(int i = 0;i < n;i++)
    {
        cin>>x>>gx;
        getchar();
        cin>>fx>>mx;
        a[x].id = x;
        a[x].g = gx;
        a[x].fa = fx;
        a[x].ma = mx;
        a[fx].g = 'M';
        a[mx].g = 'F';
     }
     cin>>k;
     for(int i = 0;i < k;i++)
     {
         cin>>x>>y;
         if(a[x].g == a[y].g) printf("Never Mind\n");
         else
         {
             sign = false;
             memset(vis,0,sizeof(vis));
             dfs(x,0);
             dfs(y,0);
//             cout<<sign<<endl;
             if(!sign) printf("Yes\n");
             else printf("No\n");
         }
     }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值