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;
}