题解 P1294 【高手去散步】

· · 题解

------------ 我是萌新,刚刚上手dfs ~~记得上周一在被柳州小学生神仙吊打的时候就是靠深搜苟了20分~~ 这题思路很简单,我的做法是搜索+回溯 当无法达到下一层时(走到尽头或者所有点都被访问过) 就统计此时的最长路,然后更新答案 回溯时就将长度减去,然后搜索下一个点 ### dfs代码: ```cpp void dfs(int st){//深度优先搜索 for(int i=1;i<=n;i++){ if(g[st][i]&&!vis[i]){ vis[i]=1; dist+=g[st][i]; dfs(i); dist-=g[st][i];//回溯 } } max_d=max(max_d,dist);//统计最大深度 vis[st]=0; return; } ``` ### 在主函数中依次以每个点为起点进行深度优先搜索 ```cpp for(int i=1;i<=n;i++){ vis[i]=1; dfs(i); memset(vis,0,sizeof(vis));//记得清空标记数组 } ``` ### 最后,完整代码奉上: ```cpp #include<bits/stdc++.h> using namespace std; const int N=1010; int g[N][N],dist,max_d=-10*N,n,m; bool vis[N]; void dfs(int st){//深度优先搜索 for(int i=1;i<=n;i++){ if(g[st][i]&&!vis[i]){ vis[i]=1; dist+=g[st][i]; dfs(i); dist-=g[st][i];//回溯 } } max_d=max(max_d,dist);//统计最大深度 vis[st]=0; return; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z;//读入边和对应的权值 g[x][y]=z; g[y][x]=z; } for(int i=1;i<=n;i++){ vis[i]=1; dfs(i); memset(vis,0,sizeof(vis));//记得清空标记数组 } cout<<max_d; return 0; } ``` ## 萌新发题解求过,如果有问题可以在评论区指出