时间限制 | 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);
}