1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| #include <iostream> #include <cstring> #define int long long
using namespace std;
const int maxn = 305; int h[maxn], ecnt = 2, n, s; struct edge { int to, next, w; } g[maxn << 1]; void add_edge(int u, int v, int w) { g[ecnt] = (edge) { v, h[u], w }; h[u] = ecnt ++; } struct node { int pos, val; } q[maxn];
int dis[maxn], sd_max[maxn], sd_secd[maxn], next[maxn], dia[maxn], head, tail; int dfs1(int u, int fa) { int alpha = u; for (int e = h[u]; e; e = g[e].next) { int v = g[e].to; if (v == fa) continue; dis[v] = dis[u] + g[e].w; int a = dfs1(v, u); if (dis[a] >= dis[alpha]) alpha = a; } return alpha; }
void dfs2(int u, int fa) { for (int e = h[u]; e; e = g[e].next) { int v = g[e].to; if (v == fa) continue; dis[v] = dis[u] + g[e].w; dfs2(v, u); int this_depth = sd_max[v] + g[e].w; if (this_depth >= sd_max[u]) { sd_secd[u] = sd_max[u]; sd_max[u] = this_depth; next[u] = v; } else if (this_depth > sd_secd[u]) { sd_secd[u] = this_depth; } } }
void inc(long long &i) { i ++; while (head < tail && q[head].pos == i - 1) head ++; }
signed main() { cin >> n >> s; for (int i = 1; i < n; i ++) { int u, v, w; cin >> u >> v >> w; add_edge(u, v, w); add_edge(v, u, w); } int ds = dfs1(1, 0); dis[ds] = 0; dfs2(ds, 0); int k = 0; for (int p = ds; p; p = next[p]) dia[++ k] = p;
int ans = 8e18; head = 0, tail = 0; for (int i = 1, j = 1; i <= k; inc(i)) { int u = dia[i]; while (j + 1 <= k + 1 && dis[dia[j]] - dis[u] <= s) { while (head < tail && q[tail - 1].val <= sd_secd[dia[j]]) tail --; q[tail ++] = (node) { j, sd_secd[dia[j]] }; j ++; } int tmp = max(dis[u], dis[dia[k]] - dis[dia[j - 1]]); tmp = max(tmp, q[head].val); ans = min(ans, tmp); } cout << ans << endl; return 0; }
|
未找到相关的 Issues 进行评论
请联系 @JeffersonQin 初始化创建