백준 1033 칵테일

https://www.acmicpc.net/problem/1033

문제 지문이 몹시 이상합니다. 저는 일단 입력이 트리의 형태로 주어진다고 가정하고 코드를 작성하였고, 맞았습니다를 받았습니다.

루트 노드에 적당히 큰 수를 저장하고 트리 탐색을 합니다. 트리 탐색을 하면서 비율에 맞게 나머지 노드들을 수정합니다.

모든 노드의 최대공약수를 구하여 나누어주면 필요한 재료의 최솟값을 찾을 수 있습니다.

#include<bits/stdc++.h>
#define ff first
#define ss second
using namespace std;
typedef long long ll;
const int SZ=15;
ll ans[15];
vector<pair<int,pair<int,int>>> graph[SZ];
ll gcd(ll x, ll y){
	return x%y!=0LL?gcd(y,x%y):y;
}
void dfs(int x, int p){
	for(auto nxt:graph[x]){
		if(nxt.ff==p) continue;
		ans[nxt.ff]=(ans[x]*(ll)nxt.ss.ss)/(ll)nxt.ss.ff;
		dfs(nxt.ff,x);
	}
}
int main(void){
	ios::sync_with_stdio(false); cin.tie(NULL);
	int n; cin>>n;
	ll mx=1;
	for(int i=1;i<n;i++){
		int a,b; ll p,q; cin>>a>>b>>p>>q;
		graph[a].push_back({b,{p,q}});
		graph[b].push_back({a,{q,p}});
		mx=mx*p*q/gcd(p,q);
	}
	ans[0]=mx;
	dfs(0,-1);
	ll g=ans[0];
	for(int i=1;i<n;i++){
		if(ans[i]==0) continue;
		g=gcd(g,ans[i]);
	}
	for(int i=0;i<n;i++) cout<<ans[i]/g<<" ";
	return 0;
}