DFS+LCA样例通过提交全部RE求调

P3304 [SDOI2013] 直径

发现数组开反了,改完 WA 0pts。 ```cpp #include <iostream> #include <vector> #include <cstring> #include <map> #include <cmath> #include <bitset> #define int long long #define endl '\n' #define inf 9223372036854775807 using namespace std; int n, u, v, w, ans, root, rot, dep[200009], dp[200009], f[200009][40]; vector<pair<int, int>> g[200009]; void dfs(int u, int fa) { dp[u] = dp[fa] + 1;; f[u][0] = fa; for (auto [v, w]: g[u]) { if (v != fa) { dep[v] = dep[u] + w; dfs(v, u); if (dep[v] > ans) { ans = dep[v]; root = v; } } } } int lca(int u, int v) { if (dp[u] < dp[v]) { swap(u, v); } while (dp[u] != dp[v]) { u = f[u][(int) log2(dp[u] - dp[v])]; } for (int i = log2(n); i >= 0; i--) { if (f[u][i] != f[v][i]) { u = f[u][i]; v = f[v][i]; } } if (u != v) { u = f[u][0]; v = f[v][0]; } return u; } signed main() { cin >> n; for (int i = 1; i < n; i++) { cin >> u >> v >> w; g[u].push_back({v, w}); g[v].push_back({u, w}); } dfs(1, 0); memset(dep, 0, sizeof dep); memset(dp, 0, sizeof dp); rot = root; ans = 0; dfs(root, 0); cout << ans << endl; for (int i = 1; i <= log2(n); i++) { for (int j = 1; j <= n; j++) { f[j][i] = f[f[j][i - 1]][i - 1]; } } bool p = false; int lca_ = 0; for (int i = 1; i <= n; i++) { if (dep[i] == ans) { if (lca_ == 0) { lca_ = i; } else { p = true; lca_ = lca(lca_, i); } } } cout << (p ? dp[lca_] - 1 : 0); } ```
by lovely_codingcow @ 2024-04-01 10:57:05


|