题目传送门https://www.luogu.com.cn/problem/P1332
这个提示一道经典的dfs题,对新学的(like 本蒟蒻)及其“友好”,下面按我讲给大家带来详细题解————
(解释都在注释里)
#include<bits/stdc++.h>
using namespace std;
int n,m;
int vis[55];
int ans=-1;
struct node{
//这个点
int a;
//联通的点
int b;
//两点长度
int len;
} road[55];
int maxx;
void dfs(int place,int step){
if(step==n){
ans=max(ans,maxx);
return ;
}
for(int i=1;i<=m;i++){
//cout<<"---"<<endl;
//没走过&&要走的是现在这个位置的联通区
if(vis[road[i].b]==0&&road[i].a==place){
//已走过
vis[road[i].b]=1;
//算总路程
maxx=maxx+road[i].len;
//往下走
dfs(road[i].b,step+1);
//他不走这一块了,-回来
maxx=maxx-road[i].len;
//回溯
vis[road[i].b]=0;
}else if(vis[road[i].a]==0&&road[i].b==place){
//已走过
vis[road[i].a]=1;
//算总路程
maxx=maxx+road[i].len;
//往下走
dfs(road[i].a,step+1);
//他不走这一块了,-回来
maxx=maxx-road[i].len;
//回溯
vis[road[i].a]=0;
}
}
ans=max(ans,maxx);
return ;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>road[i].a>>road[i].b>>road[i].len;
}
for(int i=1;i<=n;i++){
maxx=0;
vis[i]=1;
dfs(i,1);
vis[i]=0;
}
cout<<ans;
return 0;
}
你们最喜欢的纯洁代码——
#include<bits/stdc++.h>
using namespace std;
int n,m;
int vis[55];
int ans=-1;
struct node{
int a;
int b;
int len;
} road[55];
int maxx;
void dfs(int place,int step){
if(step==n){
ans=max(ans,maxx);
return ;
}
for(int i=1;i<=m;i++){
if(vis[road[i].b]==0&&road[i].a==place){
vis[road[i].b]=1;
maxx=maxx+road[i].len;
dfs(road[i].b,step+1);
maxx=maxx-road[i].len;
vis[road[i].b]=0;
}else if(vis[road[i].a]==0&&road[i].b==place){
vis[road[i].a]=1;
maxx=maxx+road[i].len;
dfs(road[i].a,step+1);
maxx=maxx-road[i].len;
vis[road[i].a]=0;
}
}
ans=max(ans,maxx);
return ;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>road[i].a>>road[i].b>>road[i].len;
}
for(int i=1;i<=n;i++){
maxx=0;
vis[i]=1;
dfs(i,1);
vis[i]=0;
}
cout<<ans;
return 0;
}