let N = Int(readLine()!)!
var graph: [[Int]] = Array(repeating: [], count: N)
var visited = Array(repeating: false, count: N)
var weight = Array(repeating: 1, count: N)
var answer = ""
for _ in 0..<N-1 {
let input = readLine()!.split(separator: " ").map{ Int(String($0))! }
let (a, b, p, q) = (input[0], input[1], input[2], input[3])
// a, b에 붙어 있는 애들 질량 업데이트
let aWeight = weight[a], bWeight = weight[b]
dfs(a, bWeight * p)
visited = Array(repeating: false, count: N)
dfs(b, aWeight * q)
visited = Array(repeating: false, count: N)
// 그래프에 연결
graph[a].append(b)
graph[b].append(a)
}
// 최종 최대공약수 찾기
var gcd = weight[0]
for i in 1..<weight.count {
let big = max(gcd, weight[i])
let small = min(gcd, weight[i])
gcd = findGcd(big, small)
}
weight.forEach{ answer += "\($0 / gcd) " }
print(answer)
func dfs(_ start: Int, _ value: Int) {
visited[start] = true
weight[start] = weight[start] * value
for node in graph[start] {
if !visited[node] {
dfs(node, value)
}
}
}
func findGcd(_ a: Int, _ b: Int) -> Int {
if a % b == 0 {
return b
}
return findGcd(b, a % b)
}
N-1개의 재료쌍이 주어진다 → 각 재료간의 관계를 연결하면 트리가 된다.
b의 질량 * p
, b에는 a의 질량 * q
를 곱한다.