

from collections import defaultdict
# 그래프 생성graph = defaultdict(list)graph['A'] = ['B', 'C', 'D']graph['B'] = ['A', 'C']graph['C'] = ['A', 'B', 'D']graph['D'] = ['A', 'C']
# Eulerian 경로 검사 (이때 Eulerian은 그래프를 정확히 한 번만 지나는 경로)
def has_eulerian_path(graph): odd_degree_count = 0 # 그래프의 정점 중 홀수인 정점의 개수를 찾음 # 차수가 짝수이거나 최대 두 개의 정점만이 홀수 차수를 가지면 경로 존재 O # Eulerian는 위의 조건들 중 최소 하나가 성립되어야 존재한다고 설정댐
for node in graph: if len(graph[node]) % 2 != 0: odd_degree_count += 1 return odd_degree_count == 0
# Eulerian 경로 찾기# 앞선 Eulerian경로가 존재하지 않는다면 None 을 반환함# 만약 Eulerian가 존재한다면 경로를 리스트인 path와 stack에 저장함# stack(이동)이 종료되면 path 의 카운트 증가 (경로 찾기 종료)\# 만약 더 이동할 수 있는 다리가 남아있다면 stack은 루프된다# 경로 탐색 종료시 Eulerian에 경로가 저장됨
def find_eulerian_path(graph): if not has_eulerian_path(graph): return None
path = [] stack = [] current_node = next(iter(graph)) while True: if len(graph[current_node]) == 0: path.append(current_node) if len(stack) == 0: break current_node = stack.pop() else: stack.append(current_node) neighbor = graph[current_node][0] graph[current_node].remove(neighbor) graph[neighbor].remove(current_node) current_node = neighbor return path
# Königsberg Bridge Problemg 해결
# 앞서 None이 실행되었다면 Eulerian 부분에서 한 번씩 건너는 경로를 찾지 못한 것이므로 후자를 출력함# None이 아니라면 경로가 존재한다고 말하고,for 루프문을 통해 각 노드(섬들)들 간의 연결을 보이며# 다리를 건너는 순서를 그래프로 표현한다.path = find_eulerian_path(graph)if path is not None: print("다리를 모두 건너는 경로가 있습니다:") for i in range(len(path) - 1): print(f"{path[i]} - {path[i+1]}")else: print("다리를 모두 건너는 경로가 없습니다.")\
# 그래프 생성graph = defaultdict(list)graph['A'] = ['B', 'C', 'D']graph['B'] = ['A', 'C']graph['C'] = ['A', 'B', 'D']graph['D'] = ['A', 'C']
# Eulerian 경로 검사 (이때 Eulerian은 그래프를 정확히 한 번만 지나는 경로)
def has_eulerian_path(graph): odd_degree_count = 0 # 그래프의 정점 중 홀수인 정점의 개수를 찾음 # 차수가 짝수이거나 최대 두 개의 정점만이 홀수 차수를 가지면 경로 존재 O # Eulerian는 위의 조건들 중 최소 하나가 성립되어야 존재한다고 설정댐
for node in graph: if len(graph[node]) % 2 != 0: odd_degree_count += 1 return odd_degree_count == 0
# Eulerian 경로 찾기# 앞선 Eulerian경로가 존재하지 않는다면 None 을 반환함# 만약 Eulerian가 존재한다면 경로를 리스트인 path와 stack에 저장함# stack(이동)이 종료되면 path 의 카운트 증가 (경로 찾기 종료)\# 만약 더 이동할 수 있는 다리가 남아있다면 stack은 루프된다# 경로 탐색 종료시 Eulerian에 경로가 저장됨
def find_eulerian_path(graph): if not has_eulerian_path(graph): return None
path = [] stack = [] current_node = next(iter(graph)) while True: if len(graph[current_node]) == 0: path.append(current_node) if len(stack) == 0: break current_node = stack.pop() else: stack.append(current_node) neighbor = graph[current_node][0] graph[current_node].remove(neighbor) graph[neighbor].remove(current_node) current_node = neighbor return path
# Königsberg Bridge Problemg 해결
# 앞서 None이 실행되었다면 Eulerian 부분에서 한 번씩 건너는 경로를 찾지 못한 것이므로 후자를 출력함# None이 아니라면 경로가 존재한다고 말하고,for 루프문을 통해 각 노드(섬들)들 간의 연결을 보이며# 다리를 건너는 순서를 그래프로 표현한다.path = find_eulerian_path(graph)if path is not None: print("다리를 모두 건너는 경로가 있습니다:") for i in range(len(path) - 1): print(f"{path[i]} - {path[i+1]}")else: print("다리를 모두 건너는 경로가 없습니다.")\
ㅈ대충 이렇게 짠건데
그래프가 좀 이상한모양으로나와

이렇게나오는데

내가 만드려한건 이거임
어디서부터꼬인지는모르겠는데
답이안나오넹...
파이썬뉴비라 나혼자선 답을못찾겟다