결국 n-1개의 간선을 줬다는거랑 똑같음.... 따라서 그래프의 개념으로 생각해 볼 수 있다.
또한 그렇다는 것은 a -> b -> c 이렇게 탐색해 나갈 수 있다는 것이고 이는 DFS를 이용하여 계속해서 비율을 구해나가면 된다.
n = int(input())
graph=[[] for _ in range(n)]
new_graph = [0] * (n)
visited = [False]*(n)
update = 1
for i in range(n-1):
a, b, p, q = map(int, input().split())
graph[a].append((b, p, q))
graph[b].append((a, q, p))
update *= (p*q) // gcd(p,q)
또한 그래프 자료형은 투플 자료형으로 (다음노드인덱스, p, q) 로 만든다. 만약 방향이 반대라면 (다음노드인덱스, q, p)로 만든다.
-> 그래프는 양방향이기 때문
def dfs(node):
for i in graph[node]:
if visited[i[0]]==False:
new_graph[i[0]] = new_graph[node] * i[2] // i[1]
visited[i[0]]=True
dfs(i[0])
return
new_graph[0] = update
visited[0]=True
dfs(0)
mgcd = new_graph[0]
for i in range(1, n):
mgcd = gcd(new_graph[i], mgcd)
for i in range(0, len(new_graph)):
new_graph[i] = int(new_graph[i] // mgcd)
print(*new_graph)
이제 만들어진 new_graph라는 비율에 각각의 값을 최대공약수로 나누어 주어 이 비율을 만족하는 최소량을 구한다.
부동소수점 이슈.....
만일 확실히 정수로 나누어떨어지는 값이라는 것을 알고있다면 그냥 안전하게 "//" 사용하자!