牛客 锻炼身体 树形结构dfs好题

https://ac.nowcoder.com/acm/contest/6915/B

题意

疫情期间,牛牛整天摊在床上沉溺于手机,身体日渐虚胖,因此牛妹拿走家中的 wifi 路由器,迫使牛牛下床来拿到路由器。在这过程中,牛牛想要在尽可能短的时间内拿到路由器,而牛妹却希望牛牛多走一会儿。现假设牛妹家中有 nnn 个房间,任意两个房间有且仅有一条路径,起初路由器在编号为 xxx 的房间内,牛牛在编号为 1 的房间内,牛牛与牛妹速度相同,当俩人同时开始移动,牛牛要经过几个房间才能拿到路由器。

只要牛牛和路由器处在同一房间,便看作牛牛已拿到路由器。

输出

牛牛最多需要经过的房间数(包括 1 号房间在内)。

示例1

5,2,[(1,2),(2,3),(3,4),(2,5)]

输出

4

说明

当牛妹将路由器放到 4 号房间时,牛牛需要经过 1 -> 2 -> 3 -> 4 共四个房间。

在这里插入图片描述在这里插入图片描述

  • 可以发现如果一个节点u到点1的距离( D u − > 1 D_{u->1} Du>1)小于等于到

    X的距离( D u − > x D_{u->x} Du>x)则点u一定不是最优点,反之是最优点V

  • 我们先以1为根节点dfs求得每个节点的深度dep1[i]

    dep1[i]代表点i到点1的距离

  • 再以X为根节点dfs求得么个节点的深度depX[i]

    depX[i]代表点i到点x的距离

  • a n s = m a x ( d e p X [ V ] ) ) ans=max(depX[V])) ans=max(depX[V]))

#ifdef debug
struct Point {
	int x;
	int y;
};
#endif

int dep1[MAXN]; //从 1 号点为根dfs出所有深度
int depX[MAXN]; //从 X 号点为根dfs出所有深度

vector<int> G[MAXN];

class Solution {
	public:
		/**
		 * 牛牛经过的房间数。
		 * @param n int整型 
		 * @param x int整型 
		 * @param Edge Point类vector 
		 * @return int整型
		 */

		void dfs(int u, int fa, int level, int* dep) {
			dep[u] = level;
			for(auto v : G[u])
				if(v != fa) dfs(v, u, level+1, dep);
		}

		int solve(int n, int x, vector<Point>& edge) {
			for(int i=0; i<=n; i++) G[i].clear();
			for(auto p : edge)
				G[p.x].push_back(p.y), 
				G[p.y].push_back(p.x);
			dfs(1, 1, 1, dep1); //计算以 1 为根的所有深度
			dfs(x, x, 1, depX); //计算以 X 为根的所有深度
			int ans = 0;
			for(int i=1; i<=n; i++)
				if(dep1[i] > depX[i])
					ans = max(ans, dep1[i]);
			return ans;
		}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值