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