欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 夏令营入门组day4

夏令营入门组day4

2024/10/24 8:22:41 来源:https://blog.csdn.net/2301_81608637/article/details/140446108  浏览:    关键词:夏令营入门组day4

 一. 题目

二. 思路

 (1)B要先去和A回合,因为B只能将红染成蓝,不能直接将白染成蓝,所以B必须走A走过的路才有效。

(2)答案分为两部分,去和A回合的最短距离 + 以回合点为根节点,遍历整棵树的距离

(3)其中遍历整棵树的最短距离为(边数 - 1) * 2 + 从根节点到最远的叶子节点的距离,因为走到一个叶子节点就会返回,回到根节点再去下一个叶子节点,因此所有边都会走两遍,但可以选一个最远的叶子节点最后一个走,到达后就留在那里不回根节点了。

三. 代码

(1)dfs1 找回合点,vector变量pash保存路径,计算A与B之间的距离。

(2)dfs2 找数的最深深度。

(3)向上取整公式:(n + 1)/ 2 - 1

#include<bits/stdc++.h>
#define LL long long
using namespace std;int n, a, b, x, y, mid, mx, dis, ans;
vector<int> G[200005];
vector<int> path;void dfs1(int u,int fa)
{path.push_back(u);if (u == b){mid = path[(path.size() + 1) / 2 - 1];dis = path.size() / 2;}for (auto v : G[u]){if (v == fa)continue;dfs1(v, u);}path.pop_back();
}void dfs2(int u, int fa, int dep)
{mx = max(mx, dep);for (auto v : G[u]){if (v == fa)continue;dfs2(v, u, dep + 1);}
}int main()
{cin >> n >> a >> b;for (int i = 1; i <= n - 1; i ++){cin >> x >> y;G[x].push_back(y);G[y].push_back(x);}if (a == b){dfs2(a, -1, 0);ans = 2 * (n - 1) -mx;cout << ans;return 0;}dfs1(a, -1);ans += dis;dfs2(mid, -1, 0);ans += 2 * (n - 1) -mx;cout << ans;return 0;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com