拓扑排序
拓扑排序(topological-sort)是指由某个集合上的一个偏序得到该集合上的一个全序的操作。拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。
拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
最大食物链计数
给你一个食物网,你要求出这个食物网中最大食物链的数量。
(这里的“最大食物链”,指的是生物学意义上的食物链,即最左端是不会捕食其他生物的生产者,最右端是不会被其他生物捕食的消费者。)
由于这个结果可能过大,你只需要输出总数模上 80112002的结果。
输入格式
第一行,两个正整数 n、m,表示生物种类 n 和吃与被吃的关系数 m。
接下来 m 行,每行两个正整数,表示被吃的生物A和吃A的生物B。
输出格式
一行一个整数,为最大食物链数量模上 80112002的结果。
输入输出样例
输入
5 7
1 2
1 3
2 3
3 5
2 5
4 5
3 4
输出
5
说明/提示
各测试点满足以下约定:
洛谷题目链接
解题思路
①、对于图论类型有向无环图的题,可以采用拓扑排序。
②、对每个节点的路径进行逐个递推,最终每个有向无环的终点之和便是答案。
ps:在拓扑排序里,每个点只会入队一次,每条边只会通过一次,时间复杂度为O(N+M)。
洛谷题解
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll total[5010], ans=0;
int start[5010], end[5010];
vector <