链接:Round #629 E 下面给出代码:
2.若已经选择好路径,如何判断查询的点在路径上或与路径距离为1。
2.对于第二点,我们从借助父亲节点。所有查询点的父亲节点必然在路径上。
给出这样一种解决方法:进入dfs访问某节点时,标记其访问次序,退出dfs离开某节点时,标记其退出次序。在该路径上且在终点之前的节点,其访问次序必定小于终点,其退出次序必定大于终点,这是由dfs决定的。#include <bits/stdc++.h> 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<int> 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]<=fi[v]&&la[u]>=la[v]; } int main(){ cin.sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i=0;i<n-1;i++){ cin >> 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<int> vis; v=0; for(int i=0;i<k;i++){ cin >> 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; }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算