'commit'
This commit is contained in:
42
TangDou/LuoGuBook/P4017_Dfs_2.cpp
Normal file
42
TangDou/LuoGuBook/P4017_Dfs_2.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
#include <bits/stdc++.h>
|
||||
|
||||
using namespace std;
|
||||
const int MOD = 80112002;
|
||||
const int N = 500010;
|
||||
int n; //生物种类
|
||||
int m; //吃与被吃的关系数
|
||||
vector<int> edge[N]; //保存DAG图的邻接表
|
||||
int ind[N]; //每个生物种类的入度
|
||||
int ans; //为最大食物链数量模上 80112002 的结果
|
||||
int f[N]; //记忆化搜索的记录数组
|
||||
//下面的代码得分通过记忆化搜索AC掉本题
|
||||
/**
|
||||
* 功能:计算以x出发点的所有食物链条数
|
||||
* @param x
|
||||
* @return
|
||||
*/
|
||||
int dfs(int x) {
|
||||
if (f[x]) return f[x];
|
||||
//如果当前节点没有出度,说明到了食物链顶端,就是一条完整的食物链,也就是递归的终点,需要+1了~
|
||||
if (!edge[x].size()) return 1;
|
||||
|
||||
//遍历所有的邻接边,所有分支食物链接数量和就是当前结点的食物链数量
|
||||
int sum = 0;
|
||||
for (int i = 0; i < edge[x].size(); i++) sum = (sum + dfs(edge[x][i])) % MOD;
|
||||
return f[x] = sum % MOD; //走一步模一步
|
||||
}
|
||||
|
||||
int main() {
|
||||
cin >> n >> m;
|
||||
//m种关系
|
||||
for (int i = 1; i <= m; i++) {
|
||||
int x, y;
|
||||
cin >> x >> y; //被吃的生物x和吃x的生物y
|
||||
edge[x].push_back(y); //用邻接表记录下食物链的关系,x被y吃掉,由x向y引一条有向边
|
||||
ind[y]++; //y入度++
|
||||
}
|
||||
//对于每个生物,如果入度为0,表示是最底层的生物,开始进行深搜,所有的“食物链条数”
|
||||
for (int i = 1; i <= n; i++) if (!ind[i]) ans = (ans + dfs(i)) % MOD;
|
||||
cout << ans << endl;
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user