为什么不能bfs+记忆化?
查看原帖
为什么不能bfs+记忆化?
287266
Viottery楼主2020/11/1 21:26

这是我记忆化的代码,第一个点过了后面的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方法。 住宿生,周五看解答,如果不能马上回复还请见谅!

2020/11/1 21:26
加载中...