已A,但是不解
查看原帖
已A,但是不解
850498
__erinww楼主2023/4/16 12:32

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

2023/4/16 12:32
加载中...