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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu 2196 computer

發(fā)布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2196 computer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

hdu 2196

題意

給出一棵樹,求出樹上每一個點在樹上走一條簡單路徑所能走的最長距離。

解法

說起來,這是我今天1A的第一題
我們設
\(up[i]\) 表示從這個點向上走到某個點又向下走的最長距離
\(down[i][0]\) 表示從這個點出發(fā)向他的子樹所能走到的最大距離,
\(down[i][1]\) 表示從這個點出發(fā)向他的子樹所能走到的次大距離,
然后我們就可以愉快的開始轉移了。
我們先dfs一邊求出 \(down[i][0/1]\) ,然后我們再dfs一邊求 \(up[i]\)
首先 \(up[i] = up[fa] + dis[i][fa]\)
如果 i 在 fa 向下走的最深路徑上,那么: \(up[i] = max(up[i],dis[i][fa]+down[fa][1])\)
否則: \(up[i] = max(up[i],dis[i][fa]+down[fa][0])\)
最后每個點的答案為 \(max(up[i],down[i][0])\)

代碼

#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <cctype> #include <vector> #define INF 2139062143 #define MAX 0x7ffffffffffffff #define del(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; template<typename T> inline void read(T&x) {x=0;T k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k; } const int maxn=10000+5; int up[maxn]; int down[maxn][2]; int n; struct Edge{int u,v,w;Edge(int u=0,int v=0,int w=0):u(u),v(v),w(w){} }; vector<Edge> edge; vector<int> G[maxn]; void add_edge(int u,int v,int w) {edge.push_back(Edge(u,v,w));edge.push_back(Edge(v,u,w));int m=edge.size();G[u].push_back(m-2);G[v].push_back(m-1); }void dfs1(int u,int fa) {for(int i=0;i<G[u].size();i++) {Edge e=edge[G[u][i]];int v=e.v;if(v==fa) continue;dfs1(v,u);if(down[v][0]+e.w>=down[u][0]){down[u][1]=down[u][0];down[u][0]=down[v][0]+e.w;}else if(down[v][0]+e.w>=down[u][1]) down[u][1]=down[v][0]+e.w;} } void dfs2(int u,int fa) {for(int i=0;i<G[u].size();i++) {Edge e=edge[G[u][i]];int v=e.v;if(v==fa) continue;if(down[u][0]!=down[v][0]+e.w)up[v]=e.w+down[u][0];else up[v]=e.w+down[u][1];up[v]=max(up[u]+e.w,up[v]);dfs2(v,u);} } void _init() {edge.clear();for(int i=1;i<=n;i++) G[i].clear();del(down,0);del(up,0); } int main() {while(~scanf("%d",&n)){_init();for(int u=2,v,w;u<=n;u++) {read(v);read(w);add_edge(u,v,w);}dfs1(1,1);dfs2(1,1);for(int i=1;i<=n;i++) printf("%d\n",max(up[i],down[i][0]));}return 0; }

轉載于:https://www.cnblogs.com/mrasd/p/9550879.html

總結

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

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