不得不吐槽一下出题人的数据真水 开始我的做法完全错了 但是居然能过19分
开始我想拓扑排序 但发现只需要bfs走一遍就好 这个时候我还用的dp 肯定是不对的 同一个点可能会入队多次 而且dp值会被加多次
实际上就是直接bfs到底就好 遍历每条路径 但是最后一个 点tle 为啥呢?
这种情况下4——>8这条路径会走三次 于是就想办法只走一遍 考虑记忆化dfs 如果就是单纯的dfs和bfs复杂度是一样的会tle
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int maxn=505;
int n,m,ans,flag=true;
vector<int>Q[maxn];
int vis[maxn];
int dfs(int u){
if(vis[u])return vis[u];
int res=0;
for(int i=0;i<Q[u].size();i++){
int to=Q[u][i];
res+=dfs(to);
}
if(!res)flag=false;
return vis[u]=res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int uu,vv;
cin>>uu>>vv;
Q[uu].push_back(vv);
}
int S,T;
cin>>S>>T;
vis[T]=1;
cout<<dfs(S)<<" ";
if(flag)
cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}