解题思路:根据题意发现从首都出发每个大城市只有一条路,所以可以确定 这个结构是一棵树,所以可以先求出树的直径(树中长度最长的路径),再算出费用

求出直径的步骤

  1. 任取一点a

  2. 对a做一遍深搜求出距离a最远的点b

  3. 对b再做一次深搜找出距离b最远的点,b到这个点的距离就是树的直径


注意事项:
不过这个题目暴力对每个点dfs其实可以拿到80分了
参考代码:

#include<bits/stdc++.h>

#define int long long

const int N =1e5+5;

//走一千米是 1+10 走两千米是 1+10+2+10 即x!+x*10

using namespace std;

bool vis[N];

typedef pair<int,int> pii;

int p1,d=0,ans;

vector<pii> m[N];

void dfs1(int u,int h){

    vis[u]=1;

    if(h>d){

        d=h;

        p1=u;

    }

    for(auto i:m[u]){

        if(vis[i.first])continue;

        dfs1(i.first,h+i.second);

    }

}

void dfs2(int u,int h){

    vis[u]=1;

    if(h>d){

        d=h;

    }

    for(auto i:m[u]){

        if(vis[i.first])continue;

        dfs2(i.first,h+i.second);

    }

}

signed main()

{   

    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    int n; cin>>n;

    for(int i=1;i<n;i++){

        int a,b,c; cin>>a>>b>>c;

        m[a].push_back({b,c});

        m[b].push_back({a,c});

    }

    dfs1(1,0);

    d=0;

    memset(vis,0,sizeof(vis));

    dfs2(p1,0);

    for(int i=1;i<=d;i++){

        ans+=i;

    }

    ans+=(d*10);

    cout<<ans<<endl;

    return 0;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论