Giả sử chúng ta có một danh sách cạnh trong đó mỗi mục đang giữ (u, v) đại diện cho u là cha của v. Chúng ta phải tìm độ dài của đường đi dài nhất trong cây. Độ dài đường dẫn là 1 + số nút trong đường dẫn đó.
Vì vậy, nếu đầu vào giống như
thì đầu ra sẽ là 5, vì đường dẫn là [1, 4, 5, 7], có tổng cộng 4 nút, do đó độ dài đường dẫn là 1 + 4 =5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- g:=danh sách gần kề của biểu đồ từ danh sách cạnh đã cho
- d:=một bản đồ mới
- Định nghĩa một hàm bfs (). Điều này sẽ mất o
- d [o]:=1
- f:=o
- q:=[o]
- với mỗi x trong q, thực hiện
- đối với mỗi y trong g [x], thực hiện
- nếu y không nằm trong d, thì
- d [y]:=d [x] + 1
- nếu d [y]> d [f], thì
- f:=y
- chèn y vào q
- nếu y không nằm trong d, thì
- đối với mỗi y trong g [x], thực hiện
- return f
- Từ phương pháp chính, hãy thực hiện như sau -
- đối với mỗi o trong g, thực hiện
- f:=bfs (o)
- d:=một bản đồ mới
- return d [bfs (f)]
- trả về 0
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(edges):
g = {}
for u, v in edges:
if u not in g:
g[u] = []
g[u] += (v,)
if v not in g:
g[v] = []
g[v] += (u,)
d = {}
def bfs(o):
d[o] = 1
f = o
q = [o]
for x in q:
for y in g[x]:
if y not in d:
d[y] = d[x] + 1
if d[y] > d[f]:
f = y
q += (y,)
return f
for o in g:
f = bfs(o)
d = {}
return d[bfs(f)]
return 0
edges = [(1, 2),(1, 3),(1, 4),(4, 5),(5,7),(1,6),(4,8)]
print(solve(edges)) Đầu vào
[(1, 2),(1, 3),(1, 4),(4, 5),(5,7),(1,6),(4,8)]
Đầu ra
5