In [ ]:
class Node:
node_number = None
neigbour = []
is_visited = False
max_distance_from_leaf = 0
all_distances = []
def __init__(self, _node_number):
self.node_number = _node_number
self.neigbour = []
self.all_distances = []
self.is_visited = False
In [ ]:
def dfs(start_node):
start_node.is_visited = True
for i in range(0, len(start_node.neigbour)):
neigh_node = start_node.neigbour[i]
if not neigh_node.is_visited:
dist_from_neigh = dfs(neigh_node)
start_node.all_distances.append(dist_from_neigh)
start_node.max_distance_from_leaf = max(start_node.max_distance_from_leaf, dist_from_neigh)
return 1 + start_node.max_distance_from_leaf
In [ ]:
node_dict = {}
no_nodes = int(raw_input())
for i in range(0, no_nodes):
number = i + 1
node = Node(number)
node_dict[number] = node
node_start = None
for i in range(0, no_nodes-1):
neighs = map(int, raw_input().split())
a = neighs[0]
b = neighs[1]
node_a = node_dict[a]
if node_start is None:
node_start = node_a
node_b = node_dict[b]
node_a.neigbour.append(node_b)
node_b.neigbour.append(node_a)
if no_nodes == 0 or no_nodes == 1:
print 0
elif no_nodes == 2:
print 1
else:
dfs(node_start)
max_dist = 0
for i in range (0, no_nodes):
curr_node = node_dict[i+1]
curr_node.all_distances.sort(reverse=True)
if len(curr_node.all_distances) == 1:
max_dist = max(max_dist, curr_node.all_distances[0])
elif len(curr_node.all_distances) > 1:
max_dist = max(max_dist, curr_node.all_distances[0] + curr_node.all_distances[1])
print max_dist