题目意思:给定n个节点,编号为0--n-1,在给定m条边,要求一条最长的路径
解题思路 回溯搜索每一点的最长的路径
代码:
//求解最长的路径长度,给个的是一个无向的图,那么我们可以用回溯法去做,只要去试探每一个点的最长的路径,然后得到最大的即可。 #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <list> #include <vector> #include <stack> #include <cmath> #include <algorithm> #define eps 1e-8 using namespace std; const int MAXN = 30; int n, m, ans, tans; int G[MAXN][MAXN];//存储地图 int vis[MAXN];//标记节点是否被走过 //搜索 int dfs(int pos , int max) { if(max > tans)//更新临时的tans tans = max; for (int i = 0; i < n; i++) { if (G[pos][i]) { --G[pos][i];//无向图每一条边只能走一次 --G[i][pos]; vis[pos] = 1;//标记节点被走过 dfs(i , max+1); ++G[pos][i];//状态的回溯 ++G[i][pos]; vis[pos] = 0; } } return tans;//返回该点能走的最大值 } void solve(){ int i , j; int temp; for(i = 0 ; i < n ; i++){ for(j = 0 ; j < n ; j++){ if(G[i][j]){//遍历每一个点 tans = 0;//初始化为0 temp = dfs(i , 0); if(ans < temp)//更新最大的值 ans = temp; } } } } //主函数 int main() { int x, y; while (scanf("%d%d%*c", &n, &m) && n && m) { memset(G, 0, sizeof (G)); for (int i = 0; i < m; i++) { scanf("%d%d", &x, &y); G[x][y] = 1;//因为每一条边只能走一次,所以标记为1即可 G[y][x] = 1; } ans = 0; solve(); printf("%d\n", ans); } return 0; }