卑微30分,在线求助
#include<cstdio>
#include<cmath>
using namespace std;
int head[100010],nxt[200010],to[200010],top=0;
int dui[500010],num=0,bj[100010]={0},chu[100010];
int p[100010],q[100010];
void add(int x,int y){
top++;
to[top]=y;
nxt[top]=head[x];
head[x]=top;
}
void up(int i){
if(i==1) return;
if(bj[dui[i/2]]>bj[dui[i]]){
dui[i]+=dui[i/2];
dui[i/2]=dui[i]-dui[i/2];
dui[i]=dui[i]-dui[i/2];
up(i/2);
}
}
void down(int i){
if(i*2>num) return;
int j=i*2;
if(j<num && bj[dui[j]]>bj[dui[j+1]]) j++;
if(bj[dui[i]]>bj[dui[j]]){
dui[i]+=dui[j];
dui[j]=dui[i]-dui[j];
dui[i]=dui[i]-dui[j];
down(j);
}
}
int gcd(int x,int y){
if(y==0) return x;
return gcd(y,x%y);
}
int main(){
int k,n,m,a,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&k);
chu[i]=k;
while(k){
scanf("%d",&a);
add(i,a);
bj[a]++;
k--;
}
}
//printf("\n %d\n",to[nxt[1]]);
for(int i=1;i<=n;i++){
num++;
dui[i]=i;
up(i);
q[i]=1;
if(bj[i]==0) p[i]=1;
else p[i]=0;
}
for(int i=1;i<=n;i++)
//printf("%d\n",bj[i]);
while(num!=0){
// printf("\n\n%d %d\n",dui[1],bj[dui[1]]);
while(bj[dui[1]]==-1 && num>0){
dui[1]=dui[num];
num--;
down(1);
}
if(num==0) break;
x=dui[1];bj[x]--;
dui[1]=dui[num];num--;down(1);
if(chu[x]==0) continue;
q[x]=q[x]*chu[x];
k=gcd(p[x],q[x]);
p[x]=p[x]/k;
q[x]=q[x]/k;
for(int i=head[x];i;i=nxt[i]){
//printf("%d ",to[i]);
k=gcd(q[x],q[to[i]]);
//printf("%d %d %d %d",p[x],q[x],p[to[i]],q[to[i]]);
p[to[i]]=q[x]/k*p[to[i]]+q[to[i]]/k*p[x];
q[to[i]]=q[to[i]]/k*q[x];
k=gcd(p[to[i]],q[to[i]]);
p[to[i]]=p[to[i]]/k;
q[to[i]]=q[to[i]]/k;
//printf(" %d %d\n",p[to[i]],q[to[i]]);
bj[to[i]]--;
num++;dui[num]=to[i];up(num);
}
//for(int i=1;i<=n;i++)
//printf("%d ",bj[i]);
}
for(int i=1;i<=n;i++)
if(chu[i]==0)
printf("%d %d\n",p[i],q[i]);
}