经典换根dp——hdu2196

ゞ 浴缸里的玫瑰 2023-10-11 09:10 166阅读 0赞

给定一棵边权树,求距离每个点最远的点,输出这个距离

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 10005
  4. struct Edge{
  5. int to,nxt,w;}e[N<<1];
  6. int head[N],tot,n;
  7. void init(){memset(head,-1,sizeof head);tot=0;}
  8. void add(int u,int v,int w){
  9. e[tot].to=v;e[tot].w=w;e[tot].nxt=head[u];head[u]=tot++;
  10. }
  11. int d[N];
  12. void dfs1(int u,int pre){
  13. d[u]=0;
  14. for(int i=head[u];i!=-1;i=e[i].nxt){
  15. int v=e[i].to;
  16. if(v==pre)continue;
  17. dfs1(v,u);
  18. d[u]=max(d[u],d[v]+e[i].w);
  19. }
  20. }
  21. int ans[N];
  22. void dfs2(int u,int pre,int up){
  23. int mx1,mx2,id1,id2;
  24. mx1=mx2=0;
  25. id1=id2=0;
  26. for(int i=head[u];i!=-1;i=e[i].nxt){
  27. int v=e[i].to;
  28. if(v==pre)continue;
  29. if(d[v]+e[i].w>=mx1){
  30. mx2=mx1,id2=id1;
  31. mx1=d[v]+e[i].w,id1=v;
  32. }
  33. else if(d[v]+e[i].w>=mx2)
  34. mx2=d[v]+e[i].w,id2=v;
  35. }
  36. if(up>=mx1){
  37. mx2=mx1,id2=id1;
  38. mx1=up,id1=0;
  39. }
  40. else if(up>=mx2)
  41. mx2=up,id2=0;
  42. ans[u]=mx1;
  43. for(int i=head[u];i!=-1;i=e[i].nxt){
  44. int v=e[i].to;
  45. if(v==pre)continue;
  46. if(v==id1)
  47. dfs2(v,u,mx2+e[i].w);
  48. else
  49. dfs2(v,u,mx1+e[i].w);
  50. }
  51. }
  52. int main(){
  53. while(cin>>n){
  54. init();
  55. for(int i=2;i<=n;i++){
  56. int v,w;
  57. scanf("%d%d",&v,&w);
  58. add(i,v,w);add(v,i,w);
  59. }
  60. dfs1(1,1);
  61. dfs2(1,1,0);
  62. for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
  63. }
  64. }
  65. /*
  66. 7
  67. 1 10
  68. 1 20
  69. 2 2
  70. 2 1
  71. 3 1
  72. 3 100
  73. */

转载于:https://www.cnblogs.com/zsben991126/p/11380533.html

发表评论

表情:
评论列表 (有 0 条评论,166人围观)

还没有评论,来说两句吧...

相关阅读