回溯法求解无向图长路径,采用深度优先搜索
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
///
#define INF 0xffffff7
int maze[30][30];
bool vis[30][30];
int n, m;
int maxlen;
void dfs(int u, int cur) //当前结点 和 已经加入边数
{
int i, j;
if (cur > maxlen)
maxlen = cur;
for (i = 0; i < n; i++)
{
if (maze[u][i] && !vis[u][i])
{
vis[u][i] = vis[i][u] = true;
dfs(i, cur + 1);
vis[u][i] = vis[i][u] = false;
}
}
}
int main()
{
///
int i, j, k;
while (1)
{
cin >> n >> m;
if (n == 0 || m == 0)
break;
memset(maze, 0, sizeof(maze));
memset(vis, 0, sizeof(vis));
maxlen = 0;
for (i = 0; i < m; i++)
{
int from, to;
cin >> from >> to;
maze[from][to] = maze[to][from] = 1;
}
//从每一个可能的起点开始做深度优先搜索
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (maze[i][j])
{
memset(vis, 0, sizeof(vis));
vis[i][j] = vis[j][i] = true;
dfs(j, 1);
}
}
}
cout << maxlen << endl;
}
///
return 0;
}