题解:本题是间接求给出的N个点中哪两个点之间的距离最大(sum),找到最大距离之后路费就等于sum*(sum+1)/2+sum*10。
题目在蓝桥杯官网上只能 通过两组数据(蓝桥官网上的题目没有要求N的范围,CF这里做了缩小),后两组超时,但是codeforces上是可以完全通过的。后台测试数据自己体会,网解的用两遍DFS的也有好多代码不能通过的,我也实在没有想通更加节省时间的方法,欢迎大神赐教。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int Map[25][25];
int main()
{
int n,a,b,c;
cin>>n;
memset(Map,INF,sizeof(Map));
for(int i=0;i<n-1;i++)
{
scanf("%d %d %d",&a,&b,&c);
Map[a][b]=Map[b][a]=c;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(Map[i][k]!=INF&&Map[k][j]!=INF)//减小计算,可以更加省时间。
Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]);
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
sum=max(sum,Map[i][j]);
}
}
int count=sum*(sum+1)/2+sum*10;
cout<<count<<endl;
return 0;
}