图
1.那就别担心了
错误原因:
最开始的dfs没有记忆化的步骤,最开始的假设是从起点开始的所有路径都能到达终点并且最开始的路径就只有一条。这个假设是正确的,但是在某些情况下会超时,比如说起点是1,1的下面有500个节点到达2,然后2节点后面还有很长的一段路到达终点。那么我的节点2到终点的dfs会无意义的执行500次,如果后面的路径比较复杂的话会超时。
优化的思路:
我们用一个类似数组来记录每个节点到终点的路径数,对于自洽性的检测还是和我最开始的思路是一样的,不需要多用出度的数组来判断
代码:
点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
bool ok=true;
vector<vector<int>>g;
vector<bool>vis;
vector<int>memo;
int dfs(int a,int b){
ll path=0;
if(vis[a])
return memo[a];
if(a==b)
path=1;
else{
int cnt=g[a].size();
if(cnt==0){
if(a!=b){
path=0;
ok=false;
}
}
else{
for(int u:g[a]){
path+=dfs(u,b);
}
}
}
memo[a]=path;
vis[a]=true;
return path;
}
int main(){
int n,m;
cin>>n>>m;
g.resize(n+1,vector<int>());
vis.resize(n+1,false);
memo.resize(n+1);
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
}
int a,b;
cin>>a>>b;
int cnt=dfs(a,b);
cout<<cnt<<' ';
if(ok)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
浙公网安备 33010602011771号