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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话