【*1900 图论】CF1328 E

Problem - E - Codeforces

题意:

【*1900 图论】CF1328 E_第1张图片

【*1900 图论】CF1328 E_第2张图片

【*1900 图论】CF1328 E_第3张图片

【*1900 图论】CF1328 E_第4张图片

思路:

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

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

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

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

【*1900 图论】CF1328 E_第5张图片

Code:

#include 

#define int long long

using namespace std;

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

vector 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]=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 V;
		for(int i=1;i<=K;i++){
			cin>>x;
			V.push_back(F[x]);
		}
		//for(int i=0;i>__;
	while(__--)solve();return 0;
}

你可能感兴趣的:(图论,图论)