lanqiao OJ 207 大臣的旅费(两次dfs)

简介: lanqiao OJ 207 大臣的旅费(两次dfs)

用户登录

1.从任意一个点r出发,求距离他最远的点s。点s肯定是树的直径上的一个端点

2.从点s出发,求距离点s最远的点t。s和t就是最远的两个点,即树的直径

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std ;
const int N = 1e5 +10 ;
int n ;
struct edge{
  int to , w ;
};
vector<edge> e[N] ;
int dist[N] ;
//这是逐层往下进行搜索的,保证能搜索到每一个点,每到一个新的点就进行距离的增加 
void dfs(int u ,int fa ,  int d){//dfs找到距离u的最远的点 
  dist[u] = d; 
  for(int i = 0 ; i < e[u].size() ; i ++){
    int to = e[u][i].to  , w = e[u][i].w;
    if(to != fa){
      dfs(to,u,d+w) ;
    }
  }
}
int main(){
  cin >> n  ; 
  for(int i = 1 ; i < n ; i ++) {
    int a , b , c; 
    cin >> a >> b >> c ;
    e[a].push_back({b,c}) ;
    e[b].push_back({a,c}) ;
  }
  dfs(1,-1,0) ;//随便挑一个点找到距离最远的点,这个点的就是直径的一个端点 
  int root = 1 ;
  int res = 0 ;
  for(int i = 1 ; i <= n ; i ++){//遍历找到端点 
    if(dist[i] > res) {
      res = dist[i] ;
      root = i ;
    } 
  }
  dfs(root,-1,0) ;//从这一个端点进行遍历,一定能找到最远的一个点,这个点就是直径的另一个端点 
  res = 1 ;
  for(int i = 1 ; i<= n ; i++){//找到最远距离,即直径 
    res = max(res , dist[i]) ;
  }
  int ans = 0 ;
  for(int i = 1 ; i <= res ;i ++){
    ans += 10 + i ;
  }
  cout << ans << endl; 
}
目录
相关文章
|
1月前
lanqiao OJ 689 四阶幻方
lanqiao OJ 689 四阶幻方
26 0
|
1月前
lanqiao OJ 1388 寒假作业
lanqiao OJ 1388 寒假作业
32 0
|
1月前
lanqiao OJ 364 跳石头
lanqiao OJ 364 跳石头
34 6
|
1月前
lanqiao OJ 3513 岛屿个数(2023省赛)
lanqiao OJ 3513 岛屿个数(2023省赛)
14 2
|
1月前
lanqiao OJ 389 摆花
lanqiao OJ 389 摆花
15 2
|
1月前
lanqiao OJ 89 路径之谜
lanqiao OJ 89 路径之谜
18 1
|
1月前
lanqiao oj 1121 蓝桥公园(floyd)
lanqiao oj 1121 蓝桥公园(floyd)
41 0
|
1月前
lanqiao oj Frog
lanqiao oj Frog
21 0
|
1月前
lanqiao oj 186 糖果(状态压缩dp)
lanqiao oj 186 糖果(状态压缩dp)
13 0
|
1月前
lanqiao oj 1135 蓝桥幼儿园(并查集)
lanqiao oj 1135 蓝桥幼儿园(并查集)
26 0