柑橘味砖头


私信TA

用户名:uq_73696371690

访问量:531

签 名:

等  级
排  名 9003
经  验 1130
参赛次数 0
文章发表 17
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

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

求出直径的步骤

  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 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区