HDU 2196 树形dp
2013-05-03 19:59
176 查看
题目的大意就是要你求出每个节点到叶子节点的最远距离
这道题两次搜索,求出最大值,记录一个最大值一个次大值,便于更新
这道题两次搜索,求出最大值,记录一个最大值一个次大值,便于更新
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> using namespace std; #define MAXN 10008 typedef struct{ int to,next,len; } E; E edge[2*MAXN]; int head[MAXN]; int tol; int smaxn[MAXN],maxn[MAXN],smaxid[MAXN],maxid[MAXN]; void Add_Edge(int u,int v,int w){ edge[tol].to=v; edge[tol].len=w; edge[tol].next=head[u]; head[u]=tol++; } void Init(){ tol=0; memset(head,-1,sizeof(head)); } void dfs1(int u,int f){ maxn[u]=0; smaxn[u]=0; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==f)continue; dfs1(v,u); if(smaxn[u]<maxn[v]+edge[i].len){ smaxn[u]=maxn[v]+edge[i].len; smaxid[u]=v; if(smaxn[u]>maxn[u]){ swap(smaxn[u],maxn[u]); swap(smaxid[u],maxid[u]); } } } } void dfs2(int u,int s){ for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(v==s)continue; if(v==maxid[u]){ if(edge[i].len+smaxn[u]>smaxn[v]){ smaxn[v]=edge[i].len+smaxn[u]; smaxid[v]=u; if(smaxn[v]>maxn[v]){ swap(smaxn[v],maxn[v]); swap(smaxid[v],maxid[v]); } } } else { if(edge[i].len+maxn[u]>smaxn[v]){ smaxn[v]=edge[i].len+maxn[u]; smaxid[v]=u; if(smaxn[v]>maxn[v]){ swap(smaxn[v],maxn[v]); swap(smaxid[v],maxid[v]); } } } dfs2(v,u); } } int main(){ int n,v,len; while(cin>>n){ Init(); for(int i=2;i<=n;i++){ cin>>v>>len; Add_Edge(i,v,len); Add_Edge(v,i,len); } dfs1(1,-1); dfs2(1,-1); for(int i=1;i<=n;i++) cout<<maxn[i]<<endl; } }
相关文章推荐
- HDU 2196-Computer(树形dp)
- hdu 2196 树形dp
- hdu2196 树形dp
- HDU 2196 Computer 树形dp
- hdu 2196 computer (树形dp)
- Hdu 2196 Computer (树形dp)
- HDU 2196 Computer (树形DP)
- hdu 2196 树形DP
- hdu 2196 Computer (树形DP)
- hdu 2196 树形dp
- HDU 2196 Computer(树形DP)
- hdu 2196 Computer 树形DP或者树的直径
- HDU 2196——Computer(树形DP)
- HDU 2196 树形dp
- HDU 2196 树形DP
- hdu 2196 树形dp
- HDU 2196 Computer (树形DP)
- hdu 2196 【树形DP】
- HDU 2196Computer(树形DP)
- Hdu 2196 Computer(树形dp)