• DFS(邻接矩阵表示)


    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    //#define PATH
    #define VERTEX_NUM 8
    
    #ifdef PATH
    int count = 1;
    #endif
    bool visited[VERTEX_NUM + 1];        // 访问标志数组(备忘表)
    
    int FirstAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
    {
        for (int j = 1; j <= VERTEX_NUM; j++) {
            if (G[v][j] == 1)
                return j;
        }
        cout << "该点是孤立点" << endl;    // 连通图则不会到这一步
        return -1;
    }
    
    int NextAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v, int w)
    {
        for (int j = w + 1; j <= VERTEX_NUM; j++) {
            if (G[v][j] == 1)
                return j;
        }
        return -1;
    }
    
    
    void DFS(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
    {
        // 从第v个顶点出发递归地深度优先遍历图G。
        int w;
        visited[v] = true;
        cout << v << endl;
        for (w = FirstAdjVex(G, v);  w != -1;  w = NextAdjVex(G, v, w)) {
    #ifdef PATH
            cout << "------------------" << count++ << "----" << v << "->" << w << endl;    // 1
    #endif
            if (!visited[w]) {        // 对v的尚未访问的邻接顶点w递归调用DFS
                DFS(G, w);
    #ifdef PATH
                cout << v << endl;    // 有待研究?                                            // 2
    #endif
            }
        }
    #ifdef PATH
        cout << "回溯路径" << v << "->";                                                    // 3
    #endif
    }
    
    void DFSTraverse(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
    {
        // 对图G作深度优先遍历。
        int v;
        for (v = 1; v <= VERTEX_NUM; ++v)
            visited[v] = false;                    // 访问标志数组初始化
        for (v = 1; v <= VERTEX_NUM; ++v) {        // 若是连通图,则v=1即全遍历到
            if (!visited[v])
                DFS(G, v);                        // 对尚未访问的顶点调用DFS
        }
    }
    
    int main(int argc, char **argv)
    {
        freopen("cin.txt", "r", stdin);
        bool G[VERTEX_NUM + 1][VERTEX_NUM + 1] = {0};
        int a;
        int b;
        while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
            G[a][b] = 1;
            G[b][a] = 1;
        }
        for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接矩阵
            for (int j = 1; j <= VERTEX_NUM; j++) {
                cout << G[i][j] << ' ';
            }
            cout << endl;
        }
    
        DFSTraverse(G);
        cout << endl;
    
        return 0;
    }
    
    /* cin.txt:
    1 2
    2 4
    2 5
    8 4
    8 5
    1 3
    3 6
    3 7
    6 7
    0 0
    */

     

  • 相关阅读:
    咖啡豆(JavaBean)•香
    SOC FPGA篇之 如何使用VNC 扩展桌面
    C指针地址运算
    nasm 指令学习
    CPL DPL RPL 及特权间的跳转
    ubuntu终端命令
    自动动手写操作系统 中 _disp_int 堆栈保护错误
    makefile 详解1
    [ 转载] Linux/Unix环境下的make和makefile详解2
    汇编指令: LGDT、LIDT、LLDT、LMSW、LOADALL、LOADALL286、LOCK、LODSB、LODSW、LODSD
  • 原文地址:https://www.cnblogs.com/jjtx/p/2550042.html
Copyright © 2020-2023  润新知