zoukankan      html  css  js  c++  java
  • 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];            // 访问标志数组(备忘表)
    
    struct ArcNode {
        int adjvex;
        ArcNode *nextarc;
    };
    
    int FirstAdjVex(ArcNode *G[VERTEX_NUM + 1], int v)
    {
        if (G[v] == NULL)                    // v是孤立顶点
            return -1;
        return G[v]->adjvex;
    }
    
    int NextAdjVex(ArcNode *G[VERTEX_NUM + 1], int v, int w)
    {
        for (ArcNode *p = G[v]; p != NULL; p = p->nextarc) {
            if (p->adjvex == w) {            // 找到w,将返回
                if (p->nextarc == NULL)        // w已是v的最后一个邻接点
                    return -1;
                return p->nextarc->adjvex;
            }
        }
        cout << "错误!没找到w" << endl;
        return -1;
    }
    
    
    void DFS(ArcNode *G[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(ArcNode *G[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
        }
        cout << endl;
    }
    
    void CreatAdjListGraph(ArcNode *G[VERTEX_NUM + 1])
    {
        int a;
        int b;
        while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
            ArcNode *p = new ArcNode;
            if (p == NULL) {
                cout << "OVERFLOW!" << endl;
                exit(OVERFLOW);
            }
            p->adjvex = b;
            p->nextarc = G[a];    // 头插入
            G[a] = p;
    
            ArcNode *q = new ArcNode;
            if (q == NULL) {
                cout << "OVERFLOW!" << endl;
                exit(OVERFLOW);
            }
            q->adjvex = a;
            q->nextarc = G[b];    // 头插入
            G[b] = q;
        }
    }
    
    void Display(ArcNode *G[VERTEX_NUM + 1])
    {
        for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接表
            cout << i;
            for (ArcNode *p = G[i]; p != NULL; p = p->nextarc) {
                cout << "->" << p->adjvex ;
            }
            cout << endl;
        }
    }
    
    void Free(ArcNode *G[VERTEX_NUM + 1])
    {
        for (int i = 1; i <= VERTEX_NUM; i++) {
            for (ArcNode *p = G[i]; p != NULL;) {
                ArcNode *q = p;
                p = p->nextarc;
                delete q;
                q = NULL;
            }
        }
    }
    
    int main(int argc, char **argv)
    {
        freopen("cin.txt", "r", stdin);
        ArcNode *G[VERTEX_NUM + 1] = {NULL};
    
        CreatAdjListGraph(G);    // 建图(邻接表表示)
    
        Display(G);                // 显示图
    
        DFSTraverse(G);            // 遍历图
    
        Free(G);                // 释放图
    
        return 0;
    }
    
    /* cin.txt:
    1 2
    2 4
    2 5
    8 4
    8 5
    1 3
    3 6
    3 7
    6 7
    0 0
    */

     

  • 相关阅读:
    AOP 学习
    微服务架构理解[架构图](转)
    C# TSC打印二维码和条形码(转)
    C#注册表操作类--完整优化版(转)
    C#调用TSC条码打印机打印二维码(转)
    C#调用TSC条码打印机打印条码(转)
    TSC打印机使用教程终极版(转)
    海尔电商峰值系统架构设计最佳实践(转)
    亿级Web系统搭建——单机到分布式集群(转)
    数据库扩展性设计:使用二进制解决一条记录关联多个状态的问题(转),可以尝试一下
  • 原文地址:https://www.cnblogs.com/jjtx/p/2550106.html
Copyright © 2011-2022 走看看