BFS做即可
有一个点始终wa
因为数据中有人的编号为0! 真的恶心
所以把标记数组改为-1即可
#include<bits/stdc++.h> using namespace std; int fa[100050]; int ma[100050]; int vis[100050]; void bfs(int a,int b) { int cnt=0; queue<int>q; q.push(a); q.push(b); while(!q.empty()) { int u=q.front(); q.pop(); cnt+=2; if(cnt>60){printf("Yes\n");return;} if(u==0){q.push(0);q.push(0);continue;} if(fa[u]==-1)q.push(0); else { if(vis[fa[u]]){printf("No\n");return;} q.push(fa[u]); vis[fa[u]]=1; } if(ma[u]==-1)q.push(0); else { if(vis[ma[u]]){printf("No\n");return;} q.push(ma[u]); vis[ma[u]]=1; } } printf("Yes\n"); return ; } int main() { int n; memset(fa,-1,sizeof fa); memset(ma,-1,sizeof ma); scanf("%d",&n); int a,b,c; char s[5]; map<int ,int >mp; for(int i=0;i<n;i++) { scanf("%d%s%d%d",&a,s,&b,&c); if(s[0]=='M')mp[a]=1; else mp[a]=0; fa[a]=b;mp[b]=1; ma[a]=c;mp[c]=0; } int k; scanf("%d",&k); while(k--) { int a,b; scanf("%d%d",&a,&b); if(mp[a]==mp[b]) { printf("Never Mind\n");continue; } else {memset(vis,0,sizeof vis);bfs(a,b);} } return 0; }