2017-2018 ACM-ICPC, Asia Daejeon Regional Contest C(记忆化搜索)

C题

Problem C Game Map

思路:

之前暴力搜索写了好几发,一直超时,后面看其他人的题解发现要用记忆化搜索。。直接暴力搜的话有太多重

复的计算。

dist u 表示以u 为起点所能走的最长路径,通过dfs不断递归能获得以u为起点的最长路径,这条路径上的每个点

的dist必定是最大的(因为如果不是的话就会继续搜下去),当其他路径经过这些点是时直接加上他们的dist就

行了,这样就节省了非常多的操作,降低复杂度。

实现代码:

#include<bits/stdc++.h>
using namespace std;
int dist[100009];
vector<int>g[100009];
int dp(int u){
    if(dist[u]==-1){
        dist[u] = 1;
        for(int i = 0;i < g[u].size();i++){
            int v = g[u][i];
            if(g[v].size() > g[u].size())
                dist[u] = max(dist[u],dp(v)+1);
        }
    }
    return dist[u];
}

int main()
{
    int m,n,x,y;
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    memset(dist,-1,sizeof(dist));
    cin>>n>>m;
    while(m--){
        cin>>x>>y;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    int ans = 0;
    for(int i = 0;i < n;i ++){
        ans = max(ans,dp(i));
    }
    cout<<ans<<endl;
}
原文地址:https://www.cnblogs.com/kls123/p/8433593.html