//拓扑排序,模板
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int n,m,head[N],in[N],out[N],topo[N],dp[N],cnt,cnt1;
struct edge{
int to,next;//前驱与后继
//因为这是一个有向无权图,所以不需要变量w
}e[500010];
//建边函数
void add(int a,int b){
e[cnt].to=b;
e[cnt].next=head[a];
head[a]=cnt++;
}
//拓扑排序
bool TopoSort(){
stack<int> s;//创建s栈
//查找当前是否有入度为0的节点
for(int i=1;i<=n;i++){
if(in[i]==0){
s.push(i);//入栈
}
}
while(!s.empty()){
int t=s.top();//用t存储栈顶元素
s.pop(); //栈顶元素出栈
topo[cnt1++]=t;//进入topo数组(保存排序结果的数组)
//判断该点的邻接点入度-1后是否等于0
for(int i=head[t];i!=-1;i=e[i].next){
if(--in[e[i].to]==0){
dp[e[i].to]+=dp[t];
//cout<<dp[e[i].to]<<" "<<dp[t]<<" "<<i<<e[i].to<<endl;
s.push(e[i].to);//入栈
}
}
}
if(cnt1<n) return false;
else return true;
}
int main(){
int a,b,i;
cin>>n>>m;
//初始化
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++){
dp[i]=1;
}
//建边
for(i=1;i<=m;i++){
cin>>a>>b;
add(a,b);
//求入度
in[b]++;//将b点入度加一
out[a]++;
}
TopoSort();
int ans=0;
for(i=1;i<=n;i++){
if(out[i]==0){
ans=ans+dp[i];
ans=ans%80112002;
//cout<<i<<" "<<dp[i]<<" "<<ans<<endl;
}
}
cout<<ans;
return 0;
}
请大佬们看一下,给我这个小白一些帮助。
谢谢!!!