题目大意:给出两个人,判断两个人能否结婚(即五代之内有没有一样的人或者性别是否相同)
做法:每次给出两个人的时候,dfs出他们的祖上都有谁,然后暴力比较有没有相同的人就行,注意性别的保存,输入数据的时候,自己的父母的性别也要标记下,我第一次做的时候就是没有标记,只得了17分,代码如下:
/*
coder:sunshine
school:njupt
*/
#include <bits/stdc++.h>
using namespace std;
#define endl '\n' //交互题删掉
#define x first
#define y second
typedef long long ll;
typedef pair<int, int> pii;
constexpr int mod = 1e9 + 7;
map<int, vector<int>> m;
map<int, char> m1;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int a, b, c;
char d;
cin >> a >> d >> b >> c;
m1[a] = d;
m[a].push_back(b), m1[b] = 'M';
m[a].push_back(c), m1[c] = 'F';
}
int q;
cin >> q;
while (q--)
{
int a, b;
cin >> a >> b;
if (m1[a] == m1[b])
cout << "Never Mind" << endl;
else
{
vector<int> s1, s2;
function<void(int, int)> dfs1 = [&](int a, int sum)
{
if (sum == 5)
return;
if (a != -1)
{
s1.push_back(a);
for (auto c : m[a])
{
dfs1(c, sum + 1);
}
}
};
function<void(int, int)> dfs2 = [&](int a, int sum)
{
if (sum == 5)
return;
if (a != -1)
{
s2.push_back(a);
for (auto c : m[a])
{
dfs2(c, sum + 1);
}
}
};
dfs1(a, 0);
dfs2(b, 0);
bool ok = 1;
for (auto c : s1)
{
for (auto d : s2)
{
if (c == d)
{
ok = 0;
}
}
}
if (ok)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}