链接
思路:
我们要设两个数组分别记录它的入度和出度,在拓扑排序时判断它是否是最高级消费者,就把它的总链数加起来
代码:
#include<iostream>
using namespace std;
int n,m,k,x,y,tot;
struct node{
int next,to;
}b[5000001];
int head[5001],rd[5001],cd[5001],f[50005000],num[5001];
void ljb(int x,int y){
tot++;
b[tot].to=y;
b[tot].next=head[x];
head[x]=tot;
}
void topusort(){
int tl=0,hd=0;
for(int i=1;i<=n;i++){
if(rd[i]==0){
tl++;
num[i]=1;
f[tl]=i;
}
}
while(hd<tl){
hd++;
int x1=f[hd];
for(int i=head[x1];i;i=b[i].next){
int y1=b[i].to;
num[y1]+=num[x1];
num[y1]%=80112002;
rd[y1]--;
if(rd[y1]==0){
if(cd[y1]==0){
k+=num[y1];
k%=80112002;
}
tl++;
f[tl]=y1;
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
rd[y]++;
cd[x]++;
ljb(x,y);
}
topusort();
cout<<k;
}