[dfs 树] 2020牛客多校 第九场 K.The Flee Plan of Groundhog

题目

[dfs 树] 2020牛客多校 第九场 K.The Flee Plan of Groundhog_第1张图片
题目大意:在一个树形结构上A从1号结点出发走了 以1m/s的速度走了ts,B在n号结点从ts后开始以2m/s的速度追A,A开始以1m/s的速度逃跑,求A最晚多久被抓住

思路

先dfs一遍 用d[i]存下以1m/s的速度走从i到n的时间,与没得电的头节点
然后找出走了ts后的A的位置,从这个位置开始再dfs一遍。A到达i结点的时间是(d[i]+1)/2,找出最大的(d[i]+1)/2即可 不过需要注意 最后的时间不能超过d[s] 因此要在d[s]与ans之间取一个最小值

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if __cplusplus >= 201103L
#include 
#include 
#endif
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
vector<int> v[100010];
int f[100010],d[100010],ans=0;
void dfs(int n,int fa){
	f[n]=fa;
	for(int i=0;i<v[n].size();i++){
		if(v[n][i]==fa) continue;
		d[v[n][i]]=d[n]+1;
		dfs(v[n][i],n);
	}
}
void dfs1(int n){
	ans=max((d[n]+1)/2,ans);
	for(int i=0;i<v[n].size();i++){
		if(v[n][i]!=f[n]) dfs1(v[n][i]);
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int n,t;
	cin>>n>>t;
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
//	cout<<1<
	dfs(n,0);//预处理 计算i到n的时间 
//	cout<<2<
	int v=1;
	for(int i=1;i<=t;i++){
		v=f[v];
	}//找出ts后的位置
//	cout<<3<
	dfs1(v);
	cout<<min(ans,d[v])<<endl; 
    return 0;
}

你可能感兴趣的:([dfs 树] 2020牛客多校 第九场 K.The Flee Plan of Groundhog)