You analyze the performance of a computer network. The network comprises nodes connected by peer-to-peer links. There are N links and N + 1 nodes. All pairs of nodes are (directly or indirectly) connected by links, and links don't form cycles. In other words, the network has a tree topology.
Your analysis shows that communication between two nodes performs much better if the number of links on the (shortest) route between the nodes is odd. Of course, the communication is fastest when the two nodes are connected by a direct link. But, amazingly, if the nodes communicate via 3, 5, 7, etc. links, communication is much faster than if the number of links to pass is even.
Now you wonder how this influences the overall network performance. There are N * (N + 1) / 2 different pairs of nodes. You need to compute how many of them are pairs of nodes connected via an odd number of links.
Nodes are numbered from 0 to N. Links are described by two arrays of integers, A and B, each containing N integers. For each 0 ≤ I < N, there is a link between nodes A[I] and B[I].
Write a function:
def solution(A, B)
that, given two arrays, A and B, consisting of N integers and describing the links, computes the number of pairs of nodes X and Y, such that 0 ≤ X < Y ≤ N, and X and Y are connected via an odd number of links.
For example, given N = 6 and the following arrays:
A[0] = 0 B[0] = 3 A[1] = 3 B[1] = 1 A[2] = 4 B[2] = 3 A[3] = 2 B[3] = 3 A[4] = 6 B[4] = 3 A[5] = 3 B[5] = 5the function should return 6, since:
- there are six pairs of nodes connected by direct links, and
- all other pairs of nodes are connected via two links.
Given N = 5 and the following arrays:
A[0] = 0 B[0] = 1 A[1] = 4 B[1] = 3 A[2] = 2 B[2] = 1 A[3] = 2 B[3] = 3 A[4] = 4 B[4] = 5the function should return 9, since:
- there are five pairs of nodes connected by direct links,
- there are three pairs of nodes connected via three links, and
- there is one pair of nodes connected via five links.
Given N = 7 and the following arrays:
A[0] = 0 B[0] = 3 A[1] = 4 B[1] = 5 A[2] = 4 B[2] = 1 A[3] = 2 B[3] = 3 A[4] = 7 B[4] = 4 A[5] = 6 B[5] = 3 A[6] = 3 B[6] = 4the function should return 16, since:
- there are seven pairs of nodes connected by direct links, and
- there are nine pairs of nodes connected via three links.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [0..90,000];
- each element of arrays A and B is an integer within the range [0..N];
- the network has a tree topology;
- any pair of nodes is connected via no more than 1000 links.
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built = build_graph(A, B, num_nodes)
if star(graph_built, num_nodes):
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built = build_graph(A, B, num_nodes)
if star(graph_built, num_nodes):
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built = build_graph(A, B, num_nodes)
if star(graph_built, num_nodes):
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if star(graph_built, num_nodes):
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_nodes[A[i]] =
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
if
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
if
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
Node_High = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
Node_High = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
if graph_nodes[A[i]] > 1:
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
Node_High = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
if graph_nodes[A[i]] > 1:
if Node_High == False:
Node_High = True
else:
IsStar = False
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
Node_High = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
if IsStar:
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
if graph_nodes[A[i]] > 1:
if Node_High == False:
Node_High = True
else:
IsStar = False
if graph_nodes[B[i]] > 1:
if Node_High == False:
Node_High = True
else:
IsStar = False
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = True
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_nodes[A[i]] += 1
graph_nodes[B[i]] += 1
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [elem ]
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [elem ]
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if ]
flatten_matrix = [val for sublist in matrix for val in sublist]
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) > 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) > 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) > 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
pri
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) > 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
print("Es estrella")
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
Es estrella
Es estrella
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) > 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) == 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) == 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
def build_graph(A, B, num_nodes):
graph_built = [[] for i in range(num_nodes)]
graph_degree_nodes = num_nodes * [0]
IsStar = False
for i in range(len(A)):
graph_built[A[i]].append(B[i])
graph_built[B[i]].append(A[i])
graph_degree_nodes[A[i]] += 1
graph_degree_nodes[B[i]] += 1
Hig_degree = [val for val in graph_degree_nodes if val > 1]
if len(Hig_degree) == 1:
IsStar = True
return graph_built, IsStar
def star(graph_built, num_nodes):
num = 0
for i in range(len(graph_built)):
if len(graph_built) > 1:
num += 1
if num > 1:
return False
else:
return True
def search_node_degree_1(graph_built):
for i in range(len(graph_built)):
if len(graph_built[i]) == 1:
return i
def is_even(number):
if number % 2 == 1:
return True
else:
return False
def compute_odd_routes(graph_built, first_node, num_nodes):
distances = num_nodes*[0]
count = 0
followers = []
nodes_to_visit = [first_node]
while nodes_to_visit:
node_to_analize = nodes_to_visit.pop(0)
followers = graph_built[node_to_analize].copy()
for next_node in followers:
distances[next_node] = distances[node_to_analize] + 1
if is_even(distances[next_node]):
count += 1
graph_built[node_to_analize].remove(next_node)
graph_built[next_node].remove(node_to_analize)
nodes_to_visit.append(next_node)
return count
def solution(A, B):
num_nodes = len(A) + 1
if (num_nodes == 1):
return 0
elif (num_nodes == 2):
return 1
else:
graph_built, IsStar = build_graph(A, B, num_nodes)
if IsStar:
return (num_nodes-1)
else:
node_degree_1 = search_node_degree_1(graph_built)
odd_routes_node_degree_1 = compute_odd_routes(
graph_built, node_degree_1, num_nodes)
return ((num_nodes - odd_routes_node_degree_1) * odd_routes_node_degree_1)
The solution obtained perfect score.