当前位置: 代码迷 >> 综合 >> The Flee Plan of Groundhog(DFS)
  详细解决方案

The Flee Plan of Groundhog(DFS)

热度:6   发布时间:2024-02-08 13:21:45.0

The Flee Plan of Groundhog(DFS)

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

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

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

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

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

#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;
}
  相关解决方案