Pense por mais tempo: Quatro cidades A, B, C e D e...
생성일: 2025년 8월 11일
생성일: 2025년 8월 11일
Pense por mais tempo: Quatro cidades A, B, C e D estão ligadas por seis pontes distintas da seguinte maneira:
– uma ponte liga A e B;
– uma ponte liga A e C;
– uma ponte liga B e C;
– duas pontes ligam B e D;
– uma ponte liga C e D.
Quantos caminhos são possíveis ligando todas as cidades e passando por todas as pontes uma única vez, sabendo que é permitido passar em uma mesma cidade mais de uma vez?
python# Let's count Euler trails in undirected multigraph with parallel edges. from collections import defaultdict nodes = ['A','B','C','D'] edges = [('A','B','AB'), ('A','C','AC'), ('B','C','BC'), ('B','D','BD1'), ('B','D','BD2'), ('C','D','CD')] # Represent as list of edges with ids to remove when used. edge_list = edges # Adjacency mapping from node to list of edges (index) adj = defaultdict(list) for i,(u,v,lab) in enumerate(edge_list): adj[u].append(i) adj[v].append(i) N = len(edge_list) def other(i, u): a,b,lab = edge_list[i] return b if u==a else a count_CD = 0 paths = [] def backtrack(u, used, path_vertices, used_edges): # u is current node, used is count of used edges global count_CD if used == N: # must end at D if started at C; check path start if path_vertices[0] == 'C' and u == 'D': count_CD += 1 paths.append(path_vertices.copy()) return # try all unused edges incident to u for i in adj[u]: if i not in used_edges: used_edges.add(i) v = other(i,u) path_vertices.append(v) backtrack(v, used+1, path_vertices, used_edges) path_vertices.pop() used_edges.remove(i) # start at 'C' backtrack('C', 0, ['C'], set()) count_CD, len(paths) (16, 16)
É um problema de trilhas eulerianas. Os graus dos vértices são:
Como exatamente dois vértices têm grau ímpar (C e D), existe trilha euleriana e ela deve começar em C e terminar em D (ou o inverso).
Fazendo a contagem exata (considerando as duas pontes como distintas, como dito no enunciado), há 16 trilhas eulerianas partindo de C e terminando em D. Se você considerar também os percursos no sentido inverso (partindo de D e terminando em C) como diferentes, o total dobra para 32 caminhos.
Resumindo: