很明显的一个dfs算法,但我身为dfs的初学者,还是有很多想要总结的。
首先,我们直到dfs算法就是将每一种可能都遍历一次,因此我们的ans答案直接在里面进行max更新就可以保证最大。
其次,我们要考虑怎么才能让dfs算法将每一种可能都遍历一次。
我们得知,高手可以在任意一点开始遍历,这也就意味着我们必须在主函数外围加一个循环,确保能从每一点开始更新。
其次,dfs需要什么?
一个是需要保存我们遍历过的点,在这里也就是保持着曾经走过的距离,这样我们可以直接在每一层的dfs中直接加一个数xian表示现在的距离是多少。
dfs还需要回溯和判别,我们在判别这一段距离能用后,需要将这一点标记表示已经访问,并且将现在的距离加入到xian当中去。
#include<bits/stdc++.h>
using namespace std;
const int N=52;
int a[52][52];
typedef long long ll;
ll ans;
int n,m;
bool st[22];
void dfs(int k,ll xian)
{
ans=max(ans,xian);
for(int i=1;i<=n;i++)
{
if(a[k][i]>0&&st[i]==0)
{
st[i]=1;
dfs(i,xian+a[k][i]);
st[i]=0;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
a[x][y]=z;
a[y][x]=z;
}
for(int i=1;i<=n;i++)
{
st[i]=1;
dfs(i,0);
memset(st,0,sizeof(st));
}
cout<<ans<<"\n";
return 0;
}