hdu 2196 computer
生活随笔
收集整理的這篇文章主要介紹了
hdu 2196 computer
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
hdu 2196
題意
給出一棵樹,求出樹上每一個(gè)點(diǎn)在樹上走一條簡單路徑所能走的最長距離。
解法
說起來,這是我今天1A的第一題
我們設(shè)
\(up[i]\) 表示從這個(gè)點(diǎn)向上走到某個(gè)點(diǎn)又向下走的最長距離
設(shè) \(down[i][0]\) 表示從這個(gè)點(diǎn)出發(fā)向他的子樹所能走到的最大距離,
\(down[i][1]\) 表示從這個(gè)點(diǎn)出發(fā)向他的子樹所能走到的次大距離,
然后我們就可以愉快的開始轉(zhuǎn)移了。
我們先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])\)
最后每個(gè)點(diǎn)的答案為 \(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; }轉(zhuǎn)載于:https://www.cnblogs.com/mrasd/p/9550879.html
總結(jié)
以上是生活随笔為你收集整理的hdu 2196 computer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机dnf连接服务器失败,用虚拟机登录
- 下一篇: mysql错误Please use SH