40分代码:
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAXN 8192
#define MOD 80112002
using namespace std;
vector<int> g[MAXN];
int n,m,step,out[MAXN],in[MAXN];
int dp[MAXN];
bool vis[MAXN];
signed dfs(int x){
if(out[x] == 0)
return 1;
if(dp[x] != -1)
return dp[x];
int step = 0;
for(int i = 0;i < g[x].size();i ++)
step = (step+dfs(g[x][i]))%MOD;
return dp[x] = step;
}
signed main(){
memset(dp,-1,sizeof dp);
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i ++){
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
out[u] ++,in[v] ++;
}
for(int i = 1;i <= n;i ++)
if(in[i] == 0){
step = (step+dfs(i)%MOD);
}
printf("%d",step);
return 0;
}
后来看了一下题解,稍微改了一下。
100分代码:
#include <stdio.h>
#include <string.h>
#include <vector>
#define MAXN 8192
#define MOD 80112002
using namespace std;
vector<int> g[MAXN];
int n,m,step,out[MAXN],in[MAXN];
int dp[MAXN];
signed dfs(int x){
if(out[x] == 0)
return 1;
if(dp[x] != -1)
return dp[x];
int step = 0;
for(int i = 0;i < g[x].size();i ++){
int &next = g[x][i];
step = (step+dfs(next))%MOD;
}
return dp[x] = step;
}
signed main(){
memset(dp,-1,sizeof dp);
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i ++){
int u,v;
scanf("%d%d",&u,&v);
g[u].push_back(v);
out[u] ++,in[v] ++;
}
for(int i = 1;i <= n;i ++)
if(in[i] == 0){
step = (step+dfs(i))%MOD;
}
printf("%d",step);
return 0;
}
求大佬解释qwq