这是我记忆化的代码,第一个点过了后面的WA。
#include<bits/stdc++.h>
using namespace std;
vector<int> v[100005];
bool vb[100005]={0};
int ans[100005]={0};
int maxi;
void dfs(int c){
vb[c]=1;
if(ans[c]!=0){
maxi=ans[c];
}
else{
for(int i=0;i<v[c].size();i++){
if(!vb[v[c][i]]){
if(v[c][i]>maxi){
maxi=v[c][i];
}
dfs(v[c][i]);
}
}
ans[c]=maxi;
}
}
int main(){
ios::sync_with_stdio(false);
int n,k;
cin >> n >> k;
for(int i=1;i<=k;i++){
int a,b;
cin >> a >> b;
v[a].push_back(b);
}
for(int i=1;i<=n;i++){
maxi=i;
dfs(i);
cout << maxi << " ";
memset(vb,0,sizeof(vb));
}
}
然后这是我直接dfs的代码,第八个点tle其他ac。
#include<bits/stdc++.h>
using namespace std;
vector<int> v[100005];
bool vb[100005]={0};
int ans[100005]={0};
int maxi;
void dfs(int c){
vb[c]=1;
// if(ans[c]!=0){
// maxi=ans[c];
// }
// else{
for(int i=0;i<v[c].size();i++){
if(!vb[v[c][i]]){
if(v[c][i]>maxi){
maxi=v[c][i];
}
dfs(v[c][i]);
}
}
ans[c]=maxi;
// }
}
int main(){
ios::sync_with_stdio(false);
int n,k;
cin >> n >> k;
for(int i=1;i<=k;i++){
int a,b;
cin >> a >> b;
v[a].push_back(b);
// v[b].push_back(a);
}
for(int i=1;i<=n;i++){
maxi=i;
dfs(i);
cout << maxi << " ";
memset(vb,0,sizeof(vb));
}
}
还望指点。 或有没有可以优化掉第八个点的dfs方法。 住宿生,周五看解答,如果不能马上回复还请见谅!