解题思路:
dfs回溯法把每条路都找出来,和最大的做比较,这里要体会局部变量和全局变量的区别,哪些应该修改,哪些不应该修改。(一般来说,全局变量,回溯要修改),比如以下两种代码都是通过的。su分别为全局变量和局部变量时的情况,如果需要记录路径。可以选择全局,也可以选择局部。
#include<bits/stdc++.h>
#define MAX 25
using namespace std;
using gg=long long;
int n,m;
int arr[25][25];
int visited[MAX];//访问数组
gg res = 0;
gg su = 0;//su是全局变量
void dfs(int x)//分别是当前位置和当前取到的距离
{
res = max(res,su);
for(int i=1;i<=n;i++)
{
if(arr[x][i]>0&&visited[i]==0) //是否有没有走过的路
{
visited[i]=1;
su+=arr[x][i];
dfs(i);
visited[i]=0;
su-=arr[x][i];//回溯进行修改
}
}
}
int main()
{
cin>>n>>m;
int x,y,w;
for(int i=0;i<m;i++)
{
cin>>x>>y>>w;
arr[x][y]=w;
arr[y][x]=w;
}
for(int i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
visited[i]=1;
su=0;
dfs(i);
}
cout<<res<<endl;
return 0;
}
#include<bits/stdc++.h>
#define MAX 25
using namespace std;
using gg=long long;
int n,m;
int arr[25][25];
int visited[MAX];//访问数组
gg res = 0;
void dfs(int x,gg su)//分别是当前位置和当前取到的距离
//su是局部变量,回溯不修改
{
res = max(res,su);
for(int i=1;i<=n;i++)
{
if(arr[x][i]>0&&visited[i]==0) //是否有没有走过的路
{
visited[i]=1;
dfs(i,su+arr[x][i]);
visited[i]=0;
}
}
}
int main()
{
cin>>n>>m;
int x,y,w;
for(int i=0;i<m;i++)
{
cin>>x>>y>>w;
arr[x][y]=w;
arr[y][x]=w;
}
for(int i=1;i<=n;i++)
{
memset(visited,0,sizeof(visited));
visited[i]=1;
dfs(i,0);
}
cout<<res<<endl;
return 0;
}