代码如下:
#include <iostream>
#include <queue>
using namespace std;
struct ration{
int denum,numer;
static int gcd(int a,int b){
return a%b==0?b:gcd(b,a%b);
}
ration():denum(1),numer(1){
}
ration(int den,int num):denum(den),numer(num){
int g=gcd(denum,numer);
denum/=g,numer/=g;
}
ration operator+(const ration ano){
ration r;
r.denum=denum*ano.numer+numer*ano.denum;
r.numer=ano.numer*numer;
int g=gcd(r.numer,r.denum);
r.denum/=g,r.numer/=g;
return r;
}
ration operator/(const ration ano){
ration r;
r.denum=denum*ano.numer;
r.numer=numer*ano.denum;
int g=gcd(r.denum,r.numer);
r.denum/=g,r.numer/=g;
return r;
}
};
struct node{
int num,to[8]={};
ration water;
}gr[10001];
int main(){
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>gr[i].num;
for(int j=1;j<=gr[i].num;j++) cin>>gr[i].to[j];
}
queue<int> que;
while(!que.empty()) que.pop();
for(int i=1;i<=m;i++) gr[i].water=ration(1,1),que.push(i);
for(int i=m+1;i<=n;i++) gr[i].water=ration(0,1);
while(!que.empty()){
int m=que.front();
que.pop();
for(int i=1;i<=gr[m].num;i++){
int t=gr[m].to[i];
gr[t].water=gr[t].water+gr[m].water/ration(gr[m].num,1);
que.push(t);
}
}
for(int i=1;i<=n;i++){
if(gr[i].num==0){
cout<<gr[i].water.denum<<" "<<gr[i].water.numer<<endl;
}
}
return 0;
}