L3-1 那就别担心了 (30 分)——坑点,测试点分析

文章目录

思路

题目就是求从 A A A B B B 的路径条数,和判断从 A A A 的路径是否都经过 B B B 。我们采用记忆化搜索来加速即可。
这里主要为了说一下坑点,题目可能出现这样的情况:
A A A B B B 完全符合题目的条件,但是很多朋友可能没处理好,大家测测这个例子即可。
5 5
1 2
2 3
3 5
4 5
2 4
1 2
在这里插入图片描述

AC代码

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x; i<=y; ++i)
#define per(i,x,y) for(int i=x; i>=y; --i)
#define pushk push_back
#define popk pop_back
#define mem(a,b) memset(a,b,sizeof a)
#define ll long long
#define lp p<<1
#define rp p<<1|1
#define endl '\n'
#define INF 0x3f3f3f3f
using namespace std;
const int N = 520;
vector<int> g[N];
int A,B;
int cnt1=0,cnt2=0;
ll dp[N];
int f[N][N];
ll dfs(int u) {
	if(dp[u]) return dp[u];
	if(g[u].size()==0) {
		if(u==B) dp[u]=1;
		else dp[u]=0;
		return dp[u];
	}
	if(u==B) return dp[u]=1;
	ll res=0;
	for(auto &it : g[u]) {
		res+=dfs(it);
	}
	return dp[u]=res;
}
ll dfs2(int u) {
	if(dp[u]) return dp[u];
	if(g[u].size()==0) {
		return dp[u]=1;
	}
	if(u==B) return dp[u]=1;
	ll res=0;
	for(auto &it : g[u]) {
		res+=dfs2(it);
	}
	return dp[u]=res;
}
int main() {

	int n,m;
	cin>>n>>m;
	rep(i,1,m) {
		int u,v;
		cin>>u>>v;
		g[u].pushk(v);
		f[u][v]=1;
	}
	cin>>A>>B;
	ll ans=dfs(A);
		rep(i,1,n) dp[i]=0;
		ll tmp=dfs2(A);
		cout<<ans<<" ";
		if(tmp==ans) puts("Yes");
		else puts("No");

	return 0;
}

posted @ 2022-08-28 08:42  翔村亲亲鸟  阅读(28)  评论(0编辑  收藏  举报