博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC日记——Two poj 1849
阅读量:4660 次
发布时间:2019-06-09

本文共 1096 字,大约阅读时间需要 3 分钟。

 

思路:

  树形DP求直径;

  答案是边权总和*2-直径;

  dp[i][1]::以i为根的子树中最长的路径;

  dp[i][0]::以i为根的子树中次长的路径;

 

来,上代码:

#include 
#include
#include
#include
using namespace std;#define maxn 100005int n,s,E[maxn<<1],V[maxn<<1],W[maxn<<1],cnt;int head[maxn],dp[maxn][2],sum,ans=0;inline void in(int &now){ char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); }}void dfs(int now,int fa){ bool res=true; int pos=0,gs=0; for(int i=head[now];i;i=E[i]) { if(V[i]==fa) continue; res=false,dfs(V[i],now); if(W[i]+dp[V[i]][0]>gs) gs=W[i]+dp[V[i]][0],pos=V[i]; } if(res) return ; dp[now][0]=gs,gs=0; for(int i=head[now];i;i=E[i]) { if(V[i]==fa||V[i]==pos) continue; if(W[i]+dp[V[i]][0]>gs) gs=W[i]+dp[V[i]][0]; } dp[now][1]=gs,ans=max(ans,dp[now][1]+dp[now][0]);}int main(){ in(n),in(s);int u,v,w; for(int i=1;i

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6783168.html

你可能感兴趣的文章
【knockoutjs】 Computed VS Pure Computed 区别
查看>>
JS向数组中添加/删除元素
查看>>
House Robber
查看>>
Best Time to Buy and Sell Stock II
查看>>
函数参数按值传递
查看>>
第一类和第二类Stirling数
查看>>
wpf log4net使用
查看>>
python之路,正则表达式
查看>>
eclipse中java项目的创建
查看>>
Linux命令
查看>>
浅谈几种主要编程语言
查看>>
Linux tcpdump命令详解
查看>>
两个datagrid的数据移动(支持多选)
查看>>
HDU4826 Labyrinth
查看>>
jquery-layer
查看>>
JavaScript 基础
查看>>
iOS学习之六种传值方式
查看>>
EF 外键不显示、如何让外键显示!增、删、改 操作时,外键不显示,只显示导航属性!...
查看>>
mysql数据库数据恢复方案概括总结
查看>>
基于注解的spring3.0.x MVC学习笔记(二)
查看>>