有注释
2025-08-23 12:16:55
发布于:四川
#include <iostream>
// 步骤3:计算dist_diam(直径起点到各点的距离)
vector<int> dist_diam(m, 0);
for (int i = 1; i < m; ++i) {
int u = diam[i - 1], v_diam = diam[i];
// 查找u和v_diam之间的边权
for (const auto& [neigh, w_edge] : adj[u]) {
if (neigh == v_diam) {
dist_diam[i] = dist_diam[i - 1] + w_edge;
break;
}
}
}
int total_diam = dist_diam.back(); // 直径总长度
// 步骤4:计算分支最大深度和全局最大值
vector<int> max_branch(m, 0);
int max_branch_all = 0;
for (int i = 0; i < m; ++i) {
int u = diam[i];
int exclude1 = (i > 0) ? diam[i - 1] : -1;
int exclude2 = (i < m - 1) ? diam[i + 1] : -1;
int mb = calc_max_branch(u, exclude1, exclude2, n, adj);
max_branch[i] = mb;
max_branch_all = max(max_branch_all, mb);
}
// 步骤5:滑动窗口找最小偏心距
int min_ecc = INT_MAX;
int r = 0;
for (int l = 0; l < m; l) {
// 扩展r到最大合法位置
while (r < m && dist_diam[r] - dist_diam[l] <= s) {
r;
}
int current_r = r - 1;
// 计算当前窗口的偏心距
int left_dist = dist_diam[l];
int right_dist = total_diam - dist_diam[current_r];
int current_ecc = max(max(left_dist, right_dist), max_branch_all);
min_ecc = min(min_ecc, current_ecc);
}
cout << min_ecc << endl;
return 0;
}
这里空空如也
有帮助,赞一个