Tree Distances I
Tree Distances I
思路
先考虑只算节点
我们发现,这种算法的瓶颈在于必须要每个节点都算一遍,而每算一遍都需要
设
节点
但是我们知道
不过推到这里还不算完,因为如果说
设
那么如果说在
code
点击查看代码
#include <iostream> #include <vector> using namespace std; const int MaxN = 2e5 + 10; int f[MaxN][2], n; vector<int> g[MaxN]; void S(int x, int fa) { for (int i : g[x]) { if (fa == i) continue; S(i, x); int w = f[i][0] + 1; if (f[x][0] < w) { f[x][1] = f[x][0], f[x][0] = w; } else if (f[x][1] < w) { f[x][1] = w; } } } void DFS(int x, int fa) { for (int i : g[x]) { if (i == fa) continue; if (f[i][0] + 1 == f[x][0]) { int w = f[x][1] + 1; if (f[i][0] < w) { f[i][1] = f[i][0], f[i][0] = w; } else if (f[i][1] < w) { f[i][1] = w; } } else { int w = f[x][0] + 1; if (f[i][0] < w) { f[i][1] = f[i][0], f[i][0] = w; } else if (f[i][1] < w) { f[i][1] = w; } } DFS(i, x); } } int main() { cin >> n; for (int i = 1, u, v; i < n; i++) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } S(1, -1); DFS(1, -1); for (int i = 1; i <= n; i++) { cout << f[i][0] << " "; } return 0; }
习题 Tree Distances II(更水的题)
由于父亲的答案被占用了,也不会影响统计答案,然后如果用父亲
code
点击查看代码
#include <iostream> #include <vector> using namespace std; using ll = long long; const int MaxN = 2e5 + 10; ll f[MaxN], sum[MaxN], n; vector<int> g[MaxN]; ll S(int x, int fa) { ll res = 0; sum[x] = 1; for (int i : g[x]) { if (fa == i) continue; res += S(i, x) + sum[i]; sum[x] += sum[i]; } return res; } void DFS(int x, int fa) { for (int i : g[x]) { if (i == fa) continue; f[i] = f[x] + (sum[1] - sum[i]) - sum[i]; DFS(i, x); } } int main() { cin >> n; for (int i = 1, u, v; i < n; i++) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } f[1] = S(1, -1); DFS(1, -1); for (int i = 1; i <= n; i++) { cout << f[i] << " "; } return 0; }
本文作者:yabnto
本文链接:https://www.cnblogs.com/ybtarr/p/17632352.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步