在找直径两端的时候这样写就 52 pts
std::function<void(int, int)> dfs;
dfs = [&](int x, int f) -> void {
for (int i = head[x]; i; i = node[i].nxt) {
int v = node[i].v, w = node[i].w;
if (v == f) {
continue;
}
dis[v] = dis[x] + w;
if (dis[l] < dis[v]) {
l = v;
}
dfs(v, x);
}
};
dfs(1, 0);
dis[l] = 0;
dfs = [&](int x, int f) -> void {
for (int i = head[x]; i; i = node[i].nxt) {
int v = node[i].v, w = node[i].w;
if (v == f) {
continue;
}
dis[v] = dis[x] + w;
pre[v] = x;
if (dis[r] < dis[x]) {
r = x;
}
dfs(v, x);
}
};
dfs(l, 0);
这样写就 AC
std::function<void(int, int)> dfs;
dfs = [&](int x, int f) -> void {
for (int i = head[x]; i; i = node[i].nxt) {
int v = node[i].v, w = node[i].w;
if (v == f) {
continue;
}
dis[v] = dis[x] + w;
dfs(v, x);
}
};
dfs(1, 0);
dis[l] = 0;
int m = -1;
for (int i = 1; i <= n; i++) {
if (m < dis[i]) {
l = i;
m = dis[i];
}
}
dfs = [&](int x, int f) -> void {
for (int i = head[x]; i; i = node[i].nxt) {
int v = node[i].v, w = node[i].w;
if (v == f) {
continue;
}
dis[v] = dis[x] + w;
pre[v] = x;
dfs(v, x);
}
};
dfs(l, 0);
m = -1;
for (int i = 1; i <= n; i++) {
if (m < dis[i]) {
r = i;
m = dis[i];
}
}
求问大佬为什么 qwq