I Will Go Gym
阿新 • • 發佈:2018-12-12
dfs序
這個題是要通過子節點去推出父節點的狀態。給出兩點x,y,判斷y是否為x的父節點。如果每次都用dfs去搜索肯定會超時。
dfs序就是dfs遍歷一遍,記錄遍歷每個節點的最早時間和最晚時間,通過這兩個值判斷兩點的關係。(預設往下搜時間+1,回溯不加時間)
#include <iostream> #include<string.h> #include<stdio.h> #include<queue> #define inf 0x3f3f3f3f using namespace std; int n,q,du[100005],l[100005],r[100005],times; vector<int>dap[100005]; int vis[100005],s,e; void dfs(int x) { l[x]=++times; int len=dap[x].size(); for(int i=0; i<len; i++) { if(vis[dap[x][i]]==0) { vis[dap[x][i]]=1; dfs(dap[x][i]); vis[dap[x][i]]=0; } } r[x]=times; } int main() { memset(vis,0,sizeof(vis)); cin>>n>>q; for(int i=0; i<n; i++) { cin>>s; if(s==-1) continue; dap[s].push_back(i); du[i]++; } for(int i=0; i<n; i++) { if(du[i]==0) { vis[i]=1; dfs(i); } } for(int i=0; i<q; i++) { cin>>s>>e; if(l[s]>=l[e]&&r[s]<=r[e]) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }