1 题意,每条路径(两个相邻点)只能走一次,每个点可以经过无数次,求最长的路。
2 分析。
①无向边,可能有环,所以Floyd不合适,而数据较小,递归搜索。
②因为路径经过一次,所以visted[]作为是否进入下一个递归实例不合适,用visted_load[][]来标记和判断。
③注意是无向边,所以每走过一条边,要 visted_load[cur][i]=1; visted_load[i][cur]=1;,释放标记同理。
3
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m;
int mat[30][30];
int visted_load[30][30];
int best=0;
int jj=0;
void Go(int cur,int sum){
int left=0;
for(int i=0;i<n;i++){
if(mat[cur][i]&&!visted_load[cur][i]){
left=1;
visted_load[cur][i]=1;
visted_load[i][cur]=1;
Go(i,sum+1);
visted_load[cur][i]=0;
visted_load[i][cur]=0;
}
}
if(!left){
best=max(best,sum);
}
return ;
}
int main(){
while(~scanf("%d %d",&n,&m)&&n){
memset(mat,0,sizeof(mat));
memset(visted_load,0,sizeof(visted_load));
int u,v;
for(int i=0;i<m;i++){
scanf("%d %d",&u,&v);
mat[u][v]=1;
mat[v][u]=1;
}
best=0;
for(int i=0;i<n;i++){
Go(i,0);
}
cout<<best<<endl;
}
return 0;
}