【*1900 图论】CF1328 E

Problem - E - Codeforces

题意:

思路:

注意到题目的性质:满足条件的路径个数是极少的,因为每个点离路径的距离**<=1**

先考虑一条链,那么直接就选最深那个点作为端点即可

为什么,因为我们需要遍历所有点的父亲

推广到树,也是要遍历所有点的父亲

Code:

cpp 复制代码
#include <bits/stdc++.h>

#define int long long

using namespace std;

const int mxn=2e5+10;
const int mod=1e9+7;

vector<int> G[mxn];

int N,M,K,u,v,x;
int idx=0;
int dep[mxn],In[mxn],sz[mxn],F[mxn];

void dfs(int u,int fa){
	sz[u]=1;
	F[u]=fa;
	dep[u]=dep[fa]+1;
	In[u]=++idx;
	for(auto v:G[u]){
		if(v==fa) continue;
		dfs(v,u);
		sz[u]+=sz[v];
	}
}
bool cmp(int x,int y){
	return dep[x]<dep[y];
}
bool check(int u,int v){
	return In[v]>=In[u]&&In[v]<=In[u]+sz[u]-1;
}
void init(){
	for(int i=0;i<=N;i++){
		dep[i]=In[i]=sz[i]=F[i]=0;
		G[i].clear();
	}
}
void solve(){
	cin>>N>>M;
	init();
	for(int i=1;i<=N-1;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1,0);
	F[1]=1;
	while(M--){
		cin>>K;
		vector<int> V;
		for(int i=1;i<=K;i++){
			cin>>x;
			V.push_back(F[x]);
		}
		//for(int i=0;i<V.size();i++) cout<<V[i]<<" \n"[i==V.size()-1];
		sort(V.begin(),V.end(),cmp);
		int ok=1;
		for(int i=1;i<V.size();i++){
			if(!check(V[i-1],V[i])){
				ok=0;
				break;
			} 
		}
		if(ok) cout<<"YES"<<'\n';
		else cout<<"NO"<<'\n';
	}
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}
相关推荐
你的冰西瓜3 小时前
C++ 中最短路算法的详细介绍
c++·算法·图论·最短路
Swift社区3 小时前
Swift 图论实战:DFS 算法解锁 LeetCode 323 连通分量个数
算法·swift·图论
浩瀚星辰202419 小时前
图论基础算法:DFS、BFS、并查集与拓扑排序的Java实现
java·算法·深度优先·图论
lcg_magic2 天前
图论系列(一):基础概念与术语解析
图论
127_127_1276 天前
2025 FJCPC 复建 VP
数据结构·图论·模拟·ad-hoc·分治·转化
wwer1425263636 天前
数学建模_图论
数学建模·图论
ysa0510307 天前
Dijkstra 算法#图论
数据结构·算法·图论
一只鱼^_7 天前
基础算法合集-图论
数据结构·算法·深度优先·图论·广度优先·宽度优先·图搜索算法
ysa0510307 天前
图论基础算法入门笔记
数据结构·c++·笔记·算法·图论
闻缺陷则喜何志丹19 天前
【并集查找】P10729 [NOISG 2023 Qualification] Dolls|普及+
c++·算法·图论·洛谷·并集查找