数据结构实验之图论四:迷宫探索

    xiaoxiao2026-05-25  1

    数据结构实验之图论四:迷宫探索

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

    有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关;请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点?

    输入

    连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000)、边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,每行给出一对正整数,表示一条边相关联的两个顶点的编号。

     

    输出

    若可以点亮所有结点的灯,则输出从S开始并以S结束的序列,序列中相邻的顶点一定有边,否则只输出部分点亮的灯的结点序列,最后输出0,表示此迷宫不是连通图。 访问顶点时约定以编号小的结点优先的次序访问,点亮所有可以点亮的灯后,以原路返回的方式回到起点。

    示例输入

    1 6 8 1 1 2 2 3 3 4 4 5 5 6 6 4 3 6 1 5

    示例输出

    1 2 3 4 5 6 5 4 3 2 1

    提示

     

    来源

    xam 

    示例程序

      #include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> using namespace std; int m, n, s, c; int map[1010][1010], visit[1010], a[1010]; void DFS(int x) //递归进行深度遍历 { a[c++] = x; //把遍历过的节点存到数组中,用来输出和判断是否连通 visit[x] = 1; //遍历完成则把标志数组赋值为1 for(int j = 1; j <= n; j++) { if(visit[j] == 0 && map[x][j] == 1) //当没有遍历过,并且邻接矩阵值为1的时候,递归遍历 { DFS(j); a[c++] = x; //因为调用递归,所以当递归完成后的回溯是从最后遍历的开始,也就是逆序返回 } } } int main() { int T, u, v; cin >> T; while(T--) { c = 0; memset(visit, 0, sizeof(visit)); //每次都要初始化 memset(map, 0, sizeof(map)); cin >> n >> m >> s; for(int i = 0; i < m; i++) { cin >> u >> v; map[u][v] = 1; //无向图对称 map[v][u] = 1; } DFS(s); for(int i = 0; i < c - 1; i++) cout << a[i] << " "; cout << a[c - 1]; if(c != 2 * n - 1) //当没有连通的时候,输出0 cout << " " << "0"; cout << endl; } return 0; } 图下标从0开始: #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; int map[1010][1010], visit[1010]; int a[1010], b, s, n, m; void dfs(int x) { a[b++] = x; visit[x] = 1; for(int i = 0; i < n; i++) { if(map[x][i] == 1 && visit[i] == 0) { dfs(i); a[b++] = x; } } } int main() { int t, u, v; cin >> t; while(t--) { cin >> n >> m >> s; b = 0; memset(map, 0, sizeof(map)); memset(visit, 0, sizeof(visit)); for(int i = 0; i < m; i++) { cin >> u >> v; map[u - 1][v - 1] = 1; map[v - 1][u - 1] = 1; } dfs(s - 1); for(int i = 0; i < b - 1; i++) cout << a[i] + 1 << " "; cout << a[b - 1] + 1; if(b != 2 * n - 1) cout << " 0"; cout << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1310036.html
    最新回复(0)