目录
- 1 基础知识
- 2 模板
- 3 工程化
1 基础知识
暂无。。。
2 模板
暂无。。。
3 工程化
题目1:树的最长路径。
解题思路:遍历从根结点到叶子结点的最长距离和次长距离,注意遍历每一个下一步,因此避免了这两个路径有重叠。更新res,即res = max(res, d1 + d2)
。返回最长距离d1
。
C++代码如下,
#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;int n;
unordered_map<int, vector<pair<int,int>>> g;int res = 0;int dfs(int a, int fa) {int d1 = 0;//d1表示最大长度int d2 = 0;//d2表示次大长度for (auto [b,c] : g[a]) {if (b == fa) continue;int d = dfs(b, a) + c;if (d >= d1) {d2 = d1;d1 = d;} else if(d > d2) {d2 = d;}}res = max(res, d1 + d2);return d1;
}int main() {cin >> n;for (int i = 0; i < n - 1; ++i) {int a, b, c;cin >> a >> b >> c;g[a].emplace_back(b,c);g[b].emplace_back(a,c);}dfs(1, -1);cout << res << endl;return 0;
}
题目2:树的中心。
解题思路:暴力解法,遍历每一个结点,以该结点为根结点,计算到叶子结点的最长路径。
C++代码如下,
#include <iostream>
#include <vector>
#include <unordered_map>using namespace std;int n;
unordered_map<int,vector<pair<int,int>>> g;int dfs(int a, int fa) {int d = 0;for (auto [b, c] : g[a]) {if (b == fa) continue;d = max(d, dfs(b, a) + c);}return d;
}int main() {cin >> n;for (int i = 0; i < n - 1; ++i) {int a, b, c;cin >> a >> b >> c;g[a].emplace_back(b,c);g[b].emplace_back(a,c);}int res = 0x3f3f3f3f;for (int i = 1; i <= n; ++i) {res = min(res, dfs(i, -1));}cout << res << endl;return 0;
}