您的位置:首页 > 其它

蓝桥杯-历届试题-大臣的旅费(经典树形DP)

2017-03-07 23:14 351 查看


//传送门: http://dasai.lanqiao.cn/   常规方法
#include <queue>
#include <functional>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <assert.h>
using namespace std;
#define N 100005
#define INF 0x3f3f3f3f
struct edge
{
int v,dis,next;
}e
;
int head
;
int dp
[3];  //dp[i][0] 表示从子节点到 i 的最远距离,dp[i][1]表示从子节点到 i 的次远距离,dp[i][2]表示从父节点到 i 的最远距离
void dfs1(int u,int fa)
{
int a=0,b=0;
for(int i=head[u];~i;i=e[i].next){
if(e[i].v == fa) continue;
dfs1(e[i].v,u);
int tmp = dp[e[i].v][0] + e[i].dis;
if(tmp>a){
b=a;
a=tmp;
}else if(tmp>b){
b=tmp;
}
}
dp[u][0] = a;
dp[u][1] = b;
}

void dfs2(int u,int fa)
{
for(int i=head[u];~i;i=e[i].next){
int v = e[i].v;
if(v == fa) continue;
dp[v][2] = max(dp[v][1],dp[u][0]==dp[v][0]+e[i].dis?dp[u][1]:dp[u][0]);
dfs2(v,u);
}
}
int main()
{
//freopen("in.txt" ,"r",stdin);
int n;
scanf("%d",&n);
int tot = 0;
memset(head,-1,sizeof(head));
for(int i=0;i<n-1;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
e[tot].v=b;
e[tot].dis=c;
e[tot].next=head[a];
head[a]=tot++;
e[tot].v=a;
e[tot].dis=c;
e[tot].next=head[b];
head[b]=tot++;
}
int ans = 0;
dfs1(1,-1);
dfs2(1,-1);
for(int i=1;i<=n;i++){
ans = max(ans,dp[i][0]+dp[i][2]);
}
printf("%d\n",(1+ans)*ans/2+ans*10);
return 0;
}







                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息