牛客OI测试1-小叶的巡查

时间限制 1000ms 空间限制 65535KB

题目:

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

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

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

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

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

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

n<23333.

输出:

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

样例输入:

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

样例输出:

135

题意:给出n个城市,连成一棵树,求任何两个城市之间的距离的最大值。

思路:树的直径模板题。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long ll;
ll head[300000];
ll vis[300000],dis[300000];
ll n,cnt,ans,Max;
struct node
{
    ll st;
    ll ed;
    ll val;
    ll next;
}mapp[300000];
void add(ll u,ll v,ll w)
{
    mapp[cnt].st=u;
    mapp[cnt].ed=v;
    mapp[cnt].val=w;
    mapp[cnt].next=head[u];
    head[u]=cnt++;
}
void getmapp()
{
    ll u,v,w;
    memset(head,-1,sizeof(head));
    cnt=0;
    for(int i=1;i<=n-1;i++)
    {
        scanf("%lld %lld %lld",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }
}
void bfs(ll x)
{
    queue<int> que;
    while(!que.empty()) que.pop();
    memset(vis,0,sizeof(vis));
    memset(dis,0,sizeof(dis));
    ll t=x;
    Max=0;
    que.push(x);
    vis[x]=1;
    while(!que.empty())
    {
        ll now=que.front();
        que.pop();
        for(ll i=head[now];i!=-1;i=mapp[i].next)
        {
            if(!vis[mapp[i].ed])
            {
                dis[mapp[i].ed]=dis[now]+mapp[i].val;
                vis[mapp[i].ed]=1;
                que.push(mapp[i].ed);
                if(dis[mapp[i].ed]>Max)
                {
                    Max=dis[mapp[i].ed];
                    ans=mapp[i].ed;
                }
            }
        }
    }
}
int main()
{
    scanf("%lld",&n);
    getmapp();
    bfs(1);
    bfs(ans);
    ll sum=0;
    for(int i=1;i<=Max;i++)
    {
        sum+=i+10;
    }
    printf("%lld",sum);
}
原文地址:https://www.cnblogs.com/Leozi/p/13281230.html