0
点赞
收藏
分享

微信扫一扫

1207. 大臣的旅费—树的直径

googlefrank 2022-03-11 阅读 58

题目链接

求树的直径(树中最长的距离)

  1. 任意取一个点x,求其到其他所有点的距离,最远距离的为y
  2. 再求y到其他所有点的距离,此时最远距离就是答案

可以用反证法假设y点不是直径的端点证明上述结论,因为点到点之间的路径是一定的,所以可以用dfs或者bfs求距离,如果是图的话就用Dijkstra或者Floyd算法求
补充:边数=n-1就是树(无环图),边数<n-1连通块 边数>n-1有环图

AC Code

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int N = 1e5+5;
int n,p,q,d;
int dis[N],vis[N];
struct edge
{
    int id,w;
};
vector<edge> v[N];

void dfs(int x)
{
    vis[x]=1;
    for(auto it:v[x])
        if(!vis[it.id])
        {
            dis[it.id] = dis[x]+it.w;
            dfs(it.id);
        }
}

int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>p>>q>>d;
        v[p].push_back((edge){q,d});
        v[q].push_back((edge){p,d});
    }
    
    dis[1]=0;
    dfs(1);
    int pos=1;
    for(int i=1; i<=n; i++)
        if(dis[i]>dis[pos])
            pos = i;
    dis[pos]=0;
    memset(vis,0,sizeof vis);
    dfs(pos);
    for(int i=1; i<=n; i++)
        if(dis[i]>dis[pos])
            pos=i;
    
    long long ans = dis[pos]*10 + (1ll+dis[pos])*dis[pos]/2;
    cout<<ans;
    return 0;
}
举报

相关推荐

0 条评论