描述
给定一棵树,求出这棵树的直径,即树上最远两点的距离。
包含n个结点,n-1条边的连通图称为树。
示例1的树如下图所示。其中4到5之间的路径最长,是树的直径,距离为5+2+4=11
例1
输入:
6,[[0,1],[1,5],[1,2],[2,3],[2,4]],[3,4,2,1,5]
复制
返回值:
11
复制
思路和心得:
1.同类型的题目。一个连通图,无环。找直径
解法是2次bfs
2.因为本题的边的权重不为1,是其他的整数。所以只能dfs
dfs自上而下就ok
(一)2次dfs(自上而下)
python3代码
# class Interval:
# def __init__(self, a=0, b=0):
# self.start = a
# self.end = b
#
# 树的直径
# @param n int整型 树的节点个数
# @param Tree_edge Interval类一维数组 树的边
# @param Edge_value int整型一维数组 边的权值
# @return int整型
#
import collections
class Solution:
def solve(self , n , Tree_edge , Edge_value ):
# write code here
def get_max_dist_node(x: int, father: int, cur_dist: int):
max_dist = cur_dist
res_ID = x
for y, weight in adjvex[x]:
if y != father:
ID, dd = get_max_dist_node(y, x, cur_dist + weight)
if dd > max_dist:
max_dist = dd
res_ID = ID
return res_ID, max_dist
adjvex = collections.defaultdict(list)
for i in range(n - 1):
x = Tree_edge[i].start
y = Tree_edge[i].end
val = Edge_value[i]
adjvex[x].append((y, val))
adjvex[y].append((x, val))
(ID1, _) = get_max_dist_node(0, -1, 0)
(ID2, max_d) = get_max_dist_node(ID1, -1, 0)
return max_dc++代码
/**
* struct Interval {
* int start;
* int end;
* };
*/
class Solution
{
public:
/**
* 树的直径
* @param n int整型 树的节点个数
* @param Tree_edge Interval类vector 树的边
* @param Edge_value int整型vector 边的权值
* @return int整型
*/
unordered_map<int, vector<pair<int, int>> > adjvex;
pair<int, int> get_max_dist_node(int x, int father, int cur_dist)
{
int max_dist_ID = x;
int max_dist = cur_dist;
for (auto [y, weight] : adjvex[x])
{
if (y != father)
{
auto [ID, dd] = get_max_dist_node(y, x, cur_dist + weight);
{
if (dd > max_dist)
{
max_dist = dd;
max_dist_ID = ID;
}
}
}
}
return pair<int, int>{max_dist_ID, max_dist};
}
int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value)
{
// write code here
for (int i = 0; i < n - 1; i ++)
{
int x = Tree_edge[i].start;
int y = Tree_edge[i].end;
int val = Edge_value[i];
adjvex[x].push_back({y, val});
adjvex[y].push_back({x, val});
}
auto [ID1, _] = get_max_dist_node(0, -1, 0);
auto [ID2, max_d] = get_max_dist_node(ID1, -1, 0);
return max_d;
}
};java代码
import java.util.*;
/*
* public class Interval {
* int start;
* int end;
* }
*/
public class Solution
{
/**
* 树的直径
* @param n int整型 树的节点个数
* @param Tree_edge Interval类一维数组 树的边
* @param Edge_value int整型一维数组 边的权值
* @return int整型
*/
public Map<Integer, List<Integer []>> adjvex = new HashMap<>(); //建图,邻接表
public int [] get_max_dist_node(int x, int father, int cur_dist)
{
int max_dist_ID = x;
int max_dist = cur_dist;
for (Integer [] tmp1 : adjvex.getOrDefault(x, new ArrayList<>()))
{
int y = tmp1[0], weight = tmp1[1];
if (y != father)
{
int [] tmp2 = get_max_dist_node(y, x, cur_dist + weight);
int ID = tmp2[0], dd = tmp2[1];
if (dd > max_dist)
{
max_dist = dd;
max_dist_ID = ID;
}
}
}
return new int [] {max_dist_ID, max_dist};
}
public int solve (int n, Interval[] Tree_edge, int[] Edge_value)
{
// write code here
for (int i = 0; i < n - 1; i ++)
{
int x = Tree_edge[i].start;
int y = Tree_edge[i].end;
int weight = Edge_value[i];
adjvex.putIfAbsent(x, new ArrayList<>());
adjvex.putIfAbsent(y, new ArrayList<>());
adjvex.get(x).add(new Integer [] {y, weight});
adjvex.get(y).add(new Integer [] {x, weight});
}
int [] tmp1 = get_max_dist_node(0, -1, 0);
int ID1 = tmp1[0];
int [] tmp2 = get_max_dist_node(ID1, -1, 0);
int max_d = tmp2[1];
return max_d;
}
}
京公网安备 11010502036488号