日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 2196 树形dp

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2196 树形dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題意】:給出一棵樹, 每條邊有一個權值 求離每個節點最遠的點的權值和

?

看這篇題解學會的 ?http://tech.ddvip.com/2013-09/1379006959202653.html

樹形dp也蠻有趣的 ^ ^

1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 8 struct node{int v;int w;}; 9 10 vector<node>no[10002]; 11 __int64 ff[10002][2]; 12 bool vis[10002]; 13 14 void dfs1(int u,int f) 15 { 16 vis[u]=true; 17 for(int i=0;i<no[u].size();i++) 18 { 19 int vv=no[u][i].v; 20 int ww=no[u][i].w; 21 if(vis[vv]) 22 continue; 23 if(vv!=f) 24 { 25 dfs1(vv,u); 26 if(ff[u][0]<ff[vv][0]+ww) 27 ff[u][0]=ff[vv][0]+ww; 28 } 29 } 30 } 31 32 void dfs2(int u,int f) 33 { 34 vis[u]=true; 35 int max1,max2,v1,v2; 36 max1=max2=0; 37 for(int i=0;i<no[u].size();i++) 38 { 39 int vv; 40 vv=no[u][i].v; 41 if(vv!=f) 42 { 43 int ww=no[u][i].w; 44 __int64 temp; 45 temp=ff[vv][0]+ww; 46 if(temp>max1) 47 { 48 max2=max1;max1=temp; 49 v2=v1; v1=vv; 50 } 51 else if(temp==max1||temp>max2) 52 { 53 max2=temp; v2=vv; 54 } 55 } 56 } 57 if(u!=1) 58 { 59 __int64 temp; 60 temp=ff[u][1]; //第一層的ff[u][1]=0 之后的 在上一層已經算出來了 61 int vv=-1; 62 if(temp>max1) 63 { 64 max2=max1; v2=v1; 65 max1=temp; v1=vv; 66 } 67 else if(temp==max1||temp>max2) 68 { 69 max2=temp; v2=vv; 70 } 71 } 72 for(int i=0;i<no[u].size();i++) 73 { 74 int vv,ww; 75 vv=no[u][i].v; ww=no[u][i].w; 76 if(vis[vv]) 77 continue; 78 if(vv!=f) 79 { 80 if(vv==v1) 81 ff[vv][1]=max2+ww; 82 else ff[vv][1]=max1+ww; 83 } 84 dfs2(vv,u); //算u的 這一層時已經把 ff[v][1]算出來了 也就是下一層的f[u][1] 85 } 86 } 87 88 int main() 89 { 90 int i,j,n,a,b; 91 while(scanf("%d",&n)!=EOF) 92 { 93 for(int i=1;i<=n;i++) 94 no[i].clear(); 95 for(int i=2;i<=n;i++) 96 { 97 scanf("%d%d",&a,&b); 98 node t; 99 t.v=a; t.w=b; 100 no[i].push_back(t); 101 t.v=i; t.w=b; 102 no[a].push_back(t); 103 } 104 memset(ff,0,sizeof(ff)); 105 memset(vis,false,sizeof(vis)); 106 dfs1(1,-1); 107 memset(vis,false,sizeof(vis)); 108 dfs2(1,-1); 109 for(int i=1;i<=n;i++) 110 { 111 __int64 temp; 112 temp=max(ff[i][0],ff[i][1]); 113 printf("%I64d\n",temp); 114 } 115 116 } 117 return 0; 118 }

?

轉載于:https://www.cnblogs.com/assult/p/3583011.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的hdu 2196 树形dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。