Powered by:NEFU AB-IN
Link
L2-016 愿天下有情人都是失散多年的兄妹 (25 分)
-
题意
呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?
-
思路 ps: 别忘了给父母也打上性别 当给出要查询的两点时,先dfs一个点,把5层以内的点全标记上,再dfs另一个点,如果遇到标记的点,那么说明他俩不能在一起 -
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MP make_pair
#define SZ(X) ((int)(X).size())
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define DEBUG(X) cout << #X << ": " << X << endl;
typedef pair<int, int> PII;
const int INF = 0x3f3f3f3f;
const int N = 100010;
vector<int> g[N];
int n, k, flag, st[N];
unordered_map<int, char> vis;
void dfs(int u, int cnt, int type)
{
if (cnt >= 5)
return;
if (type)
st[u] = 1;
if (st[u] && !type)
{
flag = 1;
return;
}
for (auto v : g[u])
{
dfs(v, cnt + 1, type);
}
}
signed main()
{
IOS;
cin >> n;
for (int i = 1; i <= n; ++i)
{
int id, fa, ma;
char op;
cin >> id >> op >> fa >> ma;
vis[id] = op;
if (fa != -1)
g[id].push_back(fa), vis[fa] = 'M';
if (ma != -1)
g[id].push_back(ma), vis[ma] = 'F';
}
cin >> k;
for (int i = 1; i <= k; ++i)
{
int u, v;
cin >> u >> v;
if (vis[u] == vis[v])
{
cout << "Never Mind\n";
}
else
{
flag = 0;
memset(st, 0, sizeof st);
dfs(u, 0, 1);
dfs(v, 0, 0);
if (!flag)
cout << "Yes\n";
else
cout << "No\n";
}
}
return 0;
}
|