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

个人认为这个题的测试数据有问题。

前边已经对sexs设置过初值,后边else语句不加过不了最后一个测试点,说明存在对一个人性别的反复修改。因为性别不同输出是不一样的。

ac代码:

#include <bits/stdc++.h>
using namespace std;

 const int N = 3e5+10;
 
int h[N],tot,vis[N];
bool sexs[N];
struct Edge{
	int to,nxt;
}e[N];
void add(int from,int to)
{
	e[tot].to = to, e[tot].nxt = h[from];
	h[from] = tot ++ ;
}
bool dfs(int cnt,int u)
{
	if(cnt==5) return false;
	if(vis[u]) return true;
    vis[u]=1;
    for(int i=h[u]; ~i; i = e[i].nxt)
        if (dfs(cnt + 1, e[i].to)) return 1;
    return false;
}
int main()
{
    memset(sexs, 0, sizeof sexs);
	memset(h, -1, sizeof h); tot = 0;
	int n;cin >> n;
	for(int i = 0; i < n; ++i)
	{
		int u, fa, ma;
		char sex;
        cin >> u >> sex >> fa >> ma;
        if(sex == 'F') sexs[u] = 1;
        else sexs[u] = 0;
        if(fa != -1) add(u, fa);
        if(ma != -1) add(u, ma), sexs[ma] = 1;
	}
	int m; cin >> m;
	while(m--)
	{
		memset(vis,0,sizeof vis);
		int x,y; cin >> x >> y;
		if(sexs[x] == sexs[y]) 
		{
			cout << "Never Mind\n";
			continue;
		}
		dfs(0,x);
		if(dfs(0,y)) cout << "No\n";
		else cout << "Yes\n";
	}
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值