链接:Round #629 E
题意: 查询一棵树上的若干节点,要求找出一条满足以下条件的路径:所有查询的点在这条路径上或与该路径上的任意一点距离为1。 要思考两件事: 1.从根节点出发的路径很多,如何选择一条路径。下面给出代码:
#include
using namespace std;
/*
如何确定一条路径——找到深度最大的点
如何判断点是否在路径上——通过记录的出现情况
*/
const int MAX_N = 2e5+10;
const int MAX_M = 2e5+10;
const int MAX_K = 2e5+10;
int par[MAX_N];
int dep[MAX_N];
int fi[MAX_N];
int la[MAX_N];
vector re[MAX_N];
int n,m;
int u,v,k;
int T;
void dfs(int v,int fa,int depth){
dep[v]=depth;
par[v]=fa;//确定每个点的parent和depth
fi[v]=T,T++;
for(int i=0;i<re[v].size();i++){
if(re[v][i]!=fa) dfs(re[v][i],v,depth+1);
}
la[v]=T,T++;
}
bool is_find(int u,int v){
return fi[u]=la[v];
}
int main(){
cin.sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i=0;i> u >> v;
u--,v--;
re[u].push_back(v);
re[v].push_back(u);
}
T=0;
dfs(0,-1,0);
while(m--){
cin >> k;
vector vis;
v=0;
for(int i=0;i> u;
u--;
if(dep[v]<dep[u]) v=u;//找深度最大的点
vis.push_back(u);
}
bool Y=true;
for(int i=0;i<k;i++){
u=vis[i];
if(is_find(u,v)||is_find(par[u],v)) continue;
else Y=false;
}
if(Y) cout << "YES"<<'\n';
else cout << "NO"<<'\n';
}
return 0;
}