The Flee Plan of Groundhog(DFS)
思路:因为 到每个点所有时间一定,考虑以 为根 ,求每个点到 的距离
并求出每个结点的 ,然后找到 秒后 的位置 ,然后再从 开始 一遍取答案的最大值,再与 取较小值。
因为时间最大不能超过 ,这表示 在到达目的地的途中被抓了。
否则取 所有能到达的目的地的 即可。
时间复杂度:
#include<bits/stdc++.h>
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<int,int>
#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;
}