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;
}