SRM429 div2 hard

トポロジカルと間違えて1時間以上かかった。
ただのDFSーーでは説明になってないか
とりあえず条件を全て満たすものを一つ見つける
そのあと最小化するために候補全てのgcd(最大公約数)で割る

#include <cstring>
#include <string>
#include <vector>

using namespace std;
typedef long long LL;

class IngredientProportions
{
	public:

		int n;
		int propotion[10][10];
		vector<LL> pre;

		LL gcd(LL x,LL y)
		{
			if(y==0)
				return x;
			else
				return gcd(y,x%y);
		}

		void DFS(int s)
		{
			for(int i=0;i<n;i++)
				if(pre[i]==-1 && propotion[s][i]!=-1)
				{
					pre[i]=pre[s]/propotion[s][i]*propotion[i][s];
					DFS(i);
				}
		}

		vector <int> getMasses(vector<string> input)
		{
			n=0;
			memset(propotion,-1,sizeof(propotion));
			pre=vector<LL>(10,-1);

			LL m=1;

			for(int i=0;i<(int)input.size();i++)
			{
				int a,b,p,q;
				a=input[i][1]-'0';
				b=input[i][8]-'0';
				p=input[i][13]-'0';
				q=input[i][15]-'0';
				n=max(n,max(a+1,b+1));
				m*=(p*q/gcd(p,q)/gcd(p,q));
				propotion[a][b]=p/gcd(p,q);
				propotion[b][a]=q/gcd(p,q);
			}

			pre[0]=m;
			DFS(0);

			LL g=m;
			for(int i=0;i<n;i++)
				g=gcd(g,pre[i]);

			vector<int> ans(n);
			for(int i=0;i<n;i++)
				ans[i]=pre[i]/g;

			return ans;
		}
};