#include <iostream>
#include <cstdio>
#include <vector> //边的信息使用邻接表
#include <queue> //拓扑排序使用队列
using namespace std;
int n; //点的数量
int m; //边的数量
int inDegree[5001]; //保存入度数量
int outDegree[5001]; //保存出度数量
int ans[5001]; //最终的答案
struct edge { //边的信息
int e; //边终点
int v; //边的权值
};
int main()
{
scanf("%d%d", &n, &m);
vector<vector<int> > edg(n + 1, vector<int>()); //邻接表存储边的信息
for (int i = 0; i < m; ++i) {
int a, b;
scanf("%d%d", &a, &b);
++inDegree[b];
++outDegree[a];
edg[a].emplace_back(b);
}
queue<int> que;
for (int i = 1; i <= n; ++i)
if (0 == inDegree[i]) //起点
ans[i] = 1, que.push(i);
while (!que.empty()) {
int tmp = que.front();
que.pop();
for (auto e : edg[tmp]) { //邻接表下,遍历这个点为起点的所有边
ans[e] += ans[tmp];
ans[e] %= 100000007;
--inDegree[e];
if (0 == inDegree[e]) que.push(e);
}
}
int sum = 0;
for (int i = 1; i <= n; ++i)
if (0 == outDegree[i]) {
sum += ans[i];
sum %= 100000007;
}
cout << sum << endl;
return 0;
}
拓扑排序实现【640.食物链计数】
最新推荐文章于 2025-06-06 21:48:36 发布