标签:食物链 ch int Luogu void MAXN include P4017 define
思路
这个题一看到什么从入度为零的点到出度为零的点,很容易想到toposort。这个题就是最基本的toposort+DAG DP,没啥好说的……
主要注意一定是遇到出度为0的点,一条食物链才能算是结束,才能够累加答案。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define MAXN 5010
#define MAXM 500010
#define MOD 80112002
int n, m, res;
int head[MAXN], cnt;
int in[MAXN], out[MAXN];
int f[MAXN];
struct node{
int from, nxt, to;
} edge[MAXM];
inline int read(void){
int f = 1, x = 0;char ch;
do{ch = getchar();if(ch=='-')f = -1;} while (ch < '0' || ch > '9');
do{ x = (x << 1) +(x << 3) + ch - '0';ch = getchar();} while (ch >= '0' && ch <= '9');
return f * x;
}
inline void add_edge(int x,int y){
++cnt;
edge[cnt].nxt = head[x];
edge[cnt].from = x;
edge[cnt].to = y;
head[x] = cnt;
return;
}
std::queue<int> Q;
inline void _init(void){
for (int i = 1; i <= n;++i){
if(!in[i]) Q.push(i), f[i] = 1;
}
return;
}
void toposort(void){
_init();
while(!Q.empty()){
int u = Q.front();
Q.pop();
for (int i = head[u]; i;i=edge[i].nxt){
int v = edge[i].to;
f[v] = (f[v] * 1ll + f[u] * 1ll) % MOD;
--in[v];
if(!in[v]){
if(!out[v])
res = (res + f[v]) % MOD;
else Q.push(v);
}
}
}
return;
}
int main(void){
n = read(), m = read();
for (int i = 1; i <= m;++i){
int u = read(), v = read();
add_edge(u, v);
++in[v], ++out[u];
}
toposort();
printf("%d\n", res);
return 0;
}
标签:食物链,ch,int,Luogu,void,MAXN,include,P4017,define 来源: https://www.cnblogs.com/ShadowFlowhyc/p/13388971.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。