칵테일

Sirius·2025년 1월 24일
0

1) DFS와 그래프로 생각

결국 n-1개의 간선을 줬다는거랑 똑같음.... 따라서 그래프의 개념으로 생각해 볼 수 있다.
또한 그렇다는 것은 a -> b -> c 이렇게 탐색해 나갈 수 있다는 것이고 이는 DFS를 이용하여 계속해서 비율을 구해나가면 된다.

  • Q: 그런데 정수로 안나누어 떨어질 수도 있지 않나?
    A: 그렇기 때문에 처음 탐색하는 노드를 모든 비율의 최소공배수로 둔다. 이러면 어떤 비율이든 나누어 떨어질 수 있다.
    ex> p,q의 비율 값들이 1,3,7,5로 주어진다면 105가 초기 시작 노드값이 된다.
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

2) 새로운 비율들의 최대공약수로 나누어 줌

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라는 비율에 각각의 값을 최대공약수로 나누어 주어 이 비율을 만족하는 최소량을 구한다.

3) 애먹었던점

부동소수점 이슈.....
만일 확실히 정수로 나누어떨어지는 값이라는 것을 알고있다면 그냥 안전하게 "//" 사용하자!

0개의 댓글