【算法学习】学换根dp有感
1.【算法学习】排序2.【算法学习】Manacher 马拉车3.【算法学习】KMP 算法4.LCA 最近公共祖先(树链和倍增)这次真有树链了!!!5.线段覆盖问题
6.【算法学习】学换根dp有感
7.二分图最大匹配8.【算法学习】01BFS9.洛谷 P1892 [BOI2003] 团伙 种类并查集 扩展域并查集10.【算法学习】高斯消元法11.贝叶斯公式12.背包13.【算法学习】模拟退火14.【算法学习】基环树15.【算法学习】树链部分16.【算法学习】莫队17.【算法学习】分块九讲18.平衡树19.圆方树20.【算法学习】点分治21.公式22.【算法学习】笛卡尔树23.【算法学习】悬线法24.欧几里得算法与 EX25.【算法学习】逆元与求解26.【算法学习】费马定理27.三分28.裴蜀定理29.【算法学习】欧拉函数φ30.【算法学习】二维转一维问题31.【算法学习】扫描线32.【算法学习】矩阵乘法33.【算法学习】同余最短路34.【算法学习】组合数学35.【算法学习】反悔贪心自从钻研这换根DP,犹如梁山好汉破了难关。初时只觉这树状结构,分枝繁复,变化多端,哪知竟有此等妙计。每换一根,便能高效算出新解,岂不似宋江指挥众兄弟,调度得当,事半功倍。更妙的是,这容斥之法,恰如兵法计策,分而治之,避开冗余。学之愈深,愈觉精妙,心中豪气顿生,恨不得与众学者痛饮一场,论此技之神通。
感觉这换根dp真的很有意思,也好理解学习(巧的是学之前还做了类似的题目换根)
详细见例题洛谷 P3478 [POI2008] STA-Station
换根dp 其实就是容斥和树形dp的结合。
感觉非常之妙。
#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e6+10; int n; ll siz[N]; ll val[N]; ll ans[N]; vector<int> v[N]; void dfs(int u,int fa){ siz[u]=1; val[u]=val[fa]+1; for(int i=0;i<v[u].size();i++){ int y=v[u][i]; if(y==fa){ continue; } dfs(y,u); siz[u]+=siz[y]; } } void dfs2(int u,int fa){ for(int i=0;i<v[u].size();i++){ int y=v[u][i]; if(y==fa){ continue; } ans[y]=ans[u]+siz[1]-2*siz[y]; dfs2(y,u); } } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<n;i++){ int u,vv; cin>>u>>vv; v[u].push_back(vv); v[vv].push_back(u); } dfs(1,0); for(int i=1;i<=n;i++){ ans[1]+=val[i]; } dfs2(1,0); ll mx=-1,id=1; for(int i=1;i<=n;i++){ if(ans[i]>mx){ mx=ans[i]; id=i; } } cout<<id; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)