RT,30分,求助
#include<bits/stdc++.h>
using namespace std;
struct tnum{
long long fenzi,fenmu;
}water[100002];
long long n,m,d[100002][7];
bool can[100002];
queue<int>q;
long long gcd(long long a,long long b){
if (a<b) swap(a,b);
long long n=a%b;
while (n!=0){
a=b;b=n;n=a%b;
}
return b;
}
tnum plu(tnum a,tnum b){
long long c=gcd(a.fenmu,b.fenmu);
c=(a.fenmu/c)*(b.fenmu/c)*c;
tnum wait;
wait.fenmu=c;
wait.fenzi=(a.fenzi*(c/a.fenmu))+(b.fenzi*(c/b.fenmu));
// cout<<wait.fenmu<<' '<<wait.fenzi<<endl;
c=gcd(wait.fenmu,wait.fenzi);
wait.fenmu=wait.fenmu/c;wait.fenzi=wait.fenzi/c;
return wait;
}
int main(){
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
scanf("%lld %lld",&n,&m);
for (int i=1;i<=n;i++){
scanf("%lld",&d[i][0]);
for (int j=1;j<=d[i][0];j++)
scanf("%lld",&d[i][j]);
}
for (int i=1;i<=m;i++){
water[i].fenzi=1;water[i].fenmu=1;
q.push(i);
}
for (int i=1;i<=n;i++)
water[i].fenmu=1;
while(!q.empty()){
tnum dww;
int head=q.front();
dww.fenmu=water[head].fenmu*d[head][0];
dww.fenzi=water[head].fenzi;
for (int i=1;i<=d[head][0];i++){
water[d[head][i]]=plu(water[d[head][i]],dww);
// if (d[head][i]==741)
// cout<<water[d[head][i]].fenzi<<' '<<water[d[head][i]].fenmu<<endl;
if (!can[d[head][i]]){
q.push(d[head][i]);
can[d[head][i]]=true;
}
}
q.pop();
}
for (int i=1;i<=n;i++){
if (d[i][0]==0)
printf("%lld %lld\n",water[i].fenzi,water[i].fenmu);
// if (water[i].fenzi==169&&water[i].fenmu==15000){
// cout<<"cnmd"<<i<<endl;
// return 0;
// }
}
return 0;
}