题意:求节点间的最大距离

先DFS一次 记录下 每一节点的子树下的最大距离(DP[ u ] [ 0 ])和第二大距离(DP[ u ] [ 1 ])

用DP[ v ] [ 2 ] 表示由v的父节点来的最大距离

再取DP[ u ] [ 0 ] 与 DP[ u ][ 2 ] 的最值

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <time.h>;
#define cler(arr, val) memset(arr, val, sizeof(arr))
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define IN freopen ("in.txt" , "r" , stdin);
#define OUT freopen ("out.txt" , "w" , stdout);
typedef long long LL;
const int MAXN = 10014;
const int MAXM = 20014;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
struct node
{
int v,next;
LL val;
} edge[MAXM];
int head[MAXM],tol;
LL dp[MAXN][3];
bool vis[MAXN];
void init()
{
cler(head,-1);
tol=0;
}
void addedge(int u,int v,LL val)
{
edge[tol].v=v,edge[tol].val=val,edge[tol].next=head[u];
head[u]=tol++;
edge[tol].v=u,edge[tol].val=val,edge[tol].next=head[v];
head[v]=tol++;
}
void dfs1(int u)
{
if(vis[u]) return ;
vis[u]=true;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].v;
if(!vis[v])
{
dfs1(v);
dp[u][1]=max(dp[u][1],dp[v][0]+edge[i].val);
if(dp[u][1]>dp[u][0])swap(dp[u][1],dp[u][0]);
}
}
}
void dfs2(int u)
{
if(vis[u]) return ;
vis[u]=true;
for(int i=head[u]; ~i; i=edge[i].next)
{
int v=edge[i].v,val=edge[i].val;
if(!vis[v])
{
if(dp[u][0]>dp[v][0]+val)//dp[u][0]不是由dp[v][0]+val而来的
dp[v][2]=max(dp[v][2],max(dp[u][0]+val,dp[u][2]+val));//所以从非v子树来的更长
else //dp[u][0]由dp[v][0]+val而来的
dp[v][2]=max(dp[v][2],max(dp[u][1]+val,dp[u][2]+val));//推断非v子树来的哪个长
dfs2(v);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int n;
while(~scanf("%d",&n))
{
init();
for(int i=2; i<=n; i++)
{
int a;
LL b;
scanf("%d %I64d",&a ,&b );
addedge(i,a,b);
}
cler(vis,false);
cler(dp,0);
dfs1(1);
cler(vis,false);
dfs2(1);
for(int i=1;i<=n;i++)
printf("%I64d\n",max(dp[i][2],dp[i][0]));
} }

最新文章

  1. Redis系列之(二):Redis主从同步,读写分离
  2. 编写一个基本的连接池来实现连接的复用&amp;一些工程细节上的优化
  3. Channel
  4. 如何解决adb devices 端口被占用的问题zz
  5. JS tab切换事件
  6. 实例介绍Cocos2d-x物理引擎:碰撞检测
  7. C#实现在Winform中嵌入Word和Excel
  8. Stack Overflow 上人气最旺的 10 个 Java 问题
  9. Tomcat 服务器的端口号的修改
  10. ORACLE 实验二
  11. js全选checkbox框
  12. Android App 压力测试 monkeyrunner
  13. java8新特性,使用流遍历集合
  14. struts2-学习笔记(一)
  15. 团队作业4——第一次项目冲刺(Alpha版本)2017.11.19
  16. 3 Eclipse 查看不了源码
  17. 【2019雅礼集训】【CF 960G】【第一类斯特林数】【NTT&amp;多项式】permutation
  18. HashMap内部结构及实现原理
  19. 【Codeforces 331D3】Escaping on Beaveractor
  20. 海量数据拆分到nosql系统的一种方案

热门文章

  1. oc19--继承1
  2. 【转】git rebase简介(基本篇)
  3. Hadoop MapReduce编程 API入门系列之计数器(二十七)
  4. Android之MVP架构
  5. Spring学习笔记之依赖的注解(2)
  6. 算法 之 3n+1问题
  7. VMware WorkStation 用 VMTools 官方下载地址
  8. 执行 cobbler get-loaders报错
  9. C语言基础 (6) 类型转换,数组与随机数
  10. ClipboardJS实现点击复制功能