题意是有0 ~ n-1 个点,要从一个点出发,每条边只能走一次,使得经过的路径最长。我还是直接保存路径,然后DFS,只不过这次要用二维数组判断点i - j 是否已走过(若i - j 已被访问,则 j - i 也就被访问)。 #include<iostream> using namespace std; const int Max=26; bool mat[Max][Max]; bool vis[Max][Max]; //这道题是每条边只能走一次,所以要判断边是否被访问 int len,n,m,ans; void DFS(int i) { int j; for(j=0;j<n;j++) { if(mat[i][j] && !vis[i][j]) //若两点存在通路 且 这条边未被访问 则继续向下搜索 { len++; vis[i][j]=vis[j][i]=true; if(len>ans) ans=len; //每次寻找最长的路 DFS(j); len--; vis[i][j]=vis[j][i]=false; } } } bool run() { scanf("%d%d",&n,&m); if(n==0 && m==0) return false; fill(&mat[0][0],&mat[n][n]+1,false); //初始化 fill(&vis[0][0],&vis[n][n]+1,false); int i; for(i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); mat[a][b]=true; mat[b][a]=true; } ans=0; for(i=0;i<n;i++) //对每个顶点进行一次搜索 { len=0; DFS(i); } printf("%d/n",ans); return true; } int main() { while(run()); return 0; }