例题
拓扑排序详解
https://zhuanlan.zhihu.com/p/339709006
该题详解:
https://www.cnblogs.com/CJYBlog/p/12198894.html
用到了广度遍历搜索方法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e3 + 2; //定义常量大小
const int mod = 80112002; //定义最终答案mod的值
int n, m; //n个点 m条边
int in[N], out[N]; //每个点的入度和出度
vector<int>nei[N]; //存图,即每个点相邻的点
queue<int>q; //拓扑排序模板所需队列
int ans; //答案
int num[N]; //记录到这个点的类食物连的数量,可参考图
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
out[u]++;
in[v]++;
nei[u].push_back(v);
}
for(int i=1;i<=n;i++)
{
if(!in[i])
{
q.push(i);
num[i]=1;
}
}
while(!q.empty())
{
int tot=q.front();
q.pop();
int len=nei[tot].size();
for(int i=0;i<len;i++)
{
int next=nei[tot][i];
--in[next];
num[next]=(num[tot]+num[next])%mod;
if(!in[next]) q.push(next);
}
}
for( int i = 1; i <= n; ++i) //寻找出度为0的点(最佳消费者)
if(!out[i]) ans = (ans + num[i]) % mod;//累加答案
cout<<(ans);//输出
return 0;//end
}