小叶的巡查(树的最大边)

链接:https://www.nowcoder.com/acm/contest/181/D
来源:牛客网
 

题目描述

8102年,牛客系列竞赛空前繁荣。为了更好地管理竞赛,小叶决定巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了小叶最常做的事情。小叶有一个钱袋,用于存放往来城市间的路费。

这个国家有一套优秀的交通方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

如果不在某个城市停下来修整,在连续行进过程中,小叶所花的路费与他已走过的距离有关,在走第x-1千米到第x千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

因为国家力挺牛客系列竞赛,所以国家会给小叶报销全部的路费。

现在组织想知道:小叶从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入描述:

输入的第一行包含一个整数n,表示包括首都在内的城市数
城市从1开始依次编号,1号城市为首都。
接下来n-1行,描述高速路(高速路一定是n-1条)
每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

输出描述:

输出一个整数,表示小叶最多花费的路费是多少。

示例1

输入

复制

5
1 2 2
1 3 1
2 4 5
2 5 4

输出

复制

135
#include <iostream>
#include <stdio.h>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 100005
#define ll  long long
using namespace std;
struct ac{
    int v, c;
};
vector<ac> g[N];
ll ans, u;
void dfs(int f, int v, int dis) {
    if (ans < dis) {
        ans = dis;
        u = v;
    }
    int len = g[v].size();
    for (int i = 0; i < len; ++i) {
        if (g[v][i].v == f)
            continue;
        dfs(v, g[v][i].v, g[v][i].c + dis);
    }
     
    return;
}
 
 
 
void addedge(int u, int v, int c) {
    g[u].push_back((ac){v, c});
    g[v].push_back((ac){u, c});
}
int main() {
#ifndef ONLINE_JUDGE
  freopen("in.txt", "r", stdin);
#endif
    int n;
    scanf("%d", &n);
    for (int i = 1; i < n; ++i) {
        int u, v, c;
        scanf("%d%d%d", &u, &v, &c);
        addedge(u, v, c);
    }
    ans = 0;
    dfs(-1, 1, 0);
//  cout << ans << endl;
    dfs(-1, u, 0);
    printf("%lld\n", (11 + 10 + ans) * ans / 2);
     
     
     
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN=100001;
struct node{
    int to,next,w;
     
}edge[MAXN];
int head[MAXN];
int num;
int n,m;
typedef long long ll;
void add_edge(int u,int v,int w){
    edge[++num].next=head[u];
    edge[num].to=v;
    edge[num].w=w;
    head[u]=num;
     
}
int dp[MAXN];
ll ans=0;
int ed=0;
void dfs(int u,int fa,ll now)
{
    if(now>ans)
    {
        ans=now;
        ed=u;
    }
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        if(edge[i].to!=fa)
            dfs(edge[i].to,u,now+edge[i].w);
    }
}
int main(){
     
     scanf("%d",&n);
     memset(head,-1,sizeof(head));
     for(int i=1;i<n;i++)
     {
         int u,v,w;
         scanf("%d%d%d",&u,&v,&w);
         add_edge(u,v,w);
         add_edge(v,u,w);
     }
     dfs(1,0,0);
     dfs(ed,0,0);
     printf("%lld",ans*10+(1+ans)*ans/2);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41453511/article/details/82222457