The Flee Plan of Groundhog(DFS)

The Flee Plan of Groundhog(DFS)

思路:因为 n n n到每个点所有时间一定,考虑以 n n n为根 d f s dfs dfs,求每个点到 n n n的距离 d [ i ] d[i] d[i]

并求出每个结点的 f a [ i ] fa[i] fa[i],然后找到 t t t秒后 G r o u n d h o g Groundhog Groundhog的位置 s s s,然后再从 s s s开始 d f s dfs dfs一遍取答案的最大值,再与 d [ s ] d[s] d[s]取较小值。

因为时间最大不能超过 d [ s ] d[s] d[s],这表示 s s s在到达目的地的途中被抓了。

否则取 s s s所有能到达的目的地的 d [ i ] + 1 2 \dfrac{d[i]+1}{2} 2d[i]+1即可。

时间复杂度: O ( n ) O(n) O(n)

#include
using namespace std;
typedef long long ll;
const int N=1e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair
#define fi first
#define se second
#define pb push_back
#define il inline
int n,t,s=1,d[N],f[N],ans;
vector<int>e[N];
void dfs(int u,int fa){
	f[u]=fa;
	for(int v:e[u])	if(v!=fa) d[v]=d[u]+1,dfs(v,u);
} 
void dfs1(int u){
	ans=max(ans,(d[u]+1)>>1);
	for(int v:e[u]) if(v!=f[u]) dfs1(v);
}
int main(){
	scanf("%d%d",&n,&t);
	for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),e[u].pb(v),e[v].pb(u);
	dfs(n,0);
	for(int i=1;i<=t;i++) s=f[s];
	dfs1(s);
	printf("%d\n",min(ans,d[s])); 
	return 0;
}

你可能感兴趣的:(DFS)