锻炼身体
思路
牛牛希望走的距离尽可能短,牛妹希望牛牛走的距离尽可能长,因此,牛妹会放到一个点 , 该点要满足与牛妹起点
的距离小于该点与牛牛起点的距离,通过 dfs 分别求出
号点和
号点到其他点的距离,对满足条件的点中,取一个与
号点距离的最大值即可。
时间复杂度:
/**
* struct Point {
* int x;
* int y;
* };
*/
class Solution {
private:
#define maxn 100010
vector<int> g[maxn];
int dis[2][maxn];
public:
void dfs(int x, int fa, int id) {
dis[id][x] = dis[id][fa] + 1;
for (auto v: g[x]) {
if (v == fa) continue;
dfs(v, x, id);
}
}
int solve(int n, int x, vector<Point>& Edge) {
// write code here
for (int i = 1; i <= n; ++i) {
g[i].clear();
dis[0][i] = dis[1][i] = 0;
}
for (auto cur: Edge) {
g[cur.x].push_back(cur.y);
g[cur.y].push_back(cur.x);
}
dfs(1, 0, 0);
dfs(x, 0, 1);
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (dis[0][i] > dis[1][i])
ans = max(ans, dis[0][i]);
}
return ans;
}
};