题目详情 - L2-016 愿天下有情人都是失散多年的兄妹 (pintia.cn)
由于给出的一对一定是同辈的,所以他们不能存在五代以内的公共祖先,所以先dfs第一个人并标记其五代以内的祖先,然后dfs第二个人的五代以内祖先,若有某个祖先被标记过了就说明他们有五代以内的公共祖先。(然而这题的最后一个测试点数据有误,在最下面有说明)
正解
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int N = 100010;
bool vis[N],sex[N];
vector<vector<int>> g(N);
bool dfs(int x,int d){
vis[x] = true;
if(d == 4) return true;
for(int num: g[x]){
if(vis[num] || !dfs(num,d+1)) return false;
}
return true;
}
int main(){
cin.tie(0)->sync_with_stdio(false);
cout.tie(0);
int n; cin>>n;
for(int i = 0; i < n; i++){
int b,f,m; char c;
cin>>b>>c>>f>>m;
if(c == 'M') sex[b] = 1;
else sex[b] = 0;
if(f != -1) {
sex[f] = 1;
g[b].push_back(f);
}
if(m != -1){
sex[m] = 0;
g[b].push_back(m);
}
}
int k; cin>>k;
while(k--){
int a,b;
cin>>a>>b;
if(sex[a] == sex[b]) {
puts("Never Mind");
continue;
}
memset(vis,0,sizeof vis);
dfs(a,0);
if(dfs(b,0)) puts("Yes");
else puts("No");
}
return 0;
}
这题的最后一个测试点有误,某些人变性了。。。
由下代码可以推导出来
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int N = 100010;
bool vis[N];
int sex[N];
vector<vector<int>> g(N);
bool dfs(int x,int d){
vis[x] = true;
if(d == 4) return true;
for(int num: g[x]){
if(vis[num] || !dfs(num,d+1)) return false;
}
return true;
}
int main(){
cin.tie(0)->sync_with_stdio(false);
cout.tie(0);
int n; cin>>n;
memset(sex,-1,sizeof sex);
for(int i = 0; i < n; i++){
int b,f,m; char c;
cin>>b>>c>>f>>m;
if(c == 'M') {
if(sex[b] == 0) cout<<"ee";
sex[b] = 1;
} else {
if(sex[b] == 1) cout<<"ee";
sex[b] = 0;
}
if(f != -1) {
sex[f] = 1;
g[b].push_back(f);
}
if(m != -1){
sex[m] = 0;
g[b].push_back(m);
}
}
int k; cin>>k;
while(k--){
int a,b;
cin>>a>>b;
if(sex[a] == sex[b]) {
puts("Never Mind");
continue;
}
memset(vis,0,sizeof vis);
dfs(a,0);
if(dfs(b,0)) puts("Yes");
else puts("No");
}
return 0;
}