• 基于线性表邻接矩阵结构的图的深度/广度优先搜索算法


    // 图的存储和遍历

    #include <iostream>
    using namespace std;

    // ------------------------------------
    // 邻接矩阵的存储以及深度和广度优先遍历
    // ------------------------------------

    // 邻接矩阵的存储定义
    #define MAX 10000000
    #define MAX_VERTEX_NUM 100

    typedef enum {
     DG,DN,UDG,UDN
    }GraphKind; // 有向图、有向网、无向图、无向网

    typedef struct {
     char vexs[MAX_VERTEX_NUM];
     int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
     int vexnum, edgenum;
     GraphKind kind;
    }MGraph;

    // 构造无向图的邻接矩阵,n个节点,e条边
    void CreateUDG(MGraph &G, int n, int e) {
     G.vexnum = n;
     G.edgenum = e;

     cout << "请输入顶点信息:"<< endl;

     int i, j, k;
     for (i = 0; i < n; i++) {
      cin >> G.vexs[i]; // 输入顶点信息
     }

     for (i = 0; i < n; i++) {
      for (j = 0; j < n; j++) {
       G.edges[i][j] = 0; // 矩阵初始化为0
      }
     }
     cout << endl;
     cout << "请输入边的信息:" << endl;

     for (k = 0; k < e; k++) {
      cin >> i >> j; // 这里需要输入对称的边,也就是输入下矩阵或者上矩阵
      G.edges[i][j] = G.edges[j][i] = 1;
     }
    }

    // 无向图的深度优先遍历
    int visited[MAX_VERTEX_NUM];

    void DFS(MGraph &G, int i) {
     int j;
     cout << G.vexs[i] << " ";
     visited[i] = 1;
     for (j = 0; j < G.vexnum; j++) {
      if (G.edges[i][j] == 1 && visited[j] == 0) {
       DFS(G, j);
      }
     }
    }

    void DFS_Traverse(MGraph &G) {
     int i;
     for (i = 0; i < G.vexnum; i++) {
      visited[i] = 0;
     }
     for (i = 0; i < G.vexnum; i++) {
      if (!visited[i]) {
       DFS(G, i);
      }
     }
    }

    // 无向图的广度优先遍历

    // 循环队列的类型定义
    const int Queue_Size = 100;

    typedef struct circlQueue {
     int *elem;
     int rear;
     int front;
     int queueSize;
    }circlQueue;

    // 循环队列初始化
    void initQueue(circlQueue &Q) {
     Q.elem = new int[Queue_Size];
     Q.front = Q.rear = 0;
     Q.queueSize = Queue_Size;
    }

    // 入队列
    void enterQueue(circlQueue &Q, int x) {
     // 栈满
     if ((Q.rear + 1) % Q.queueSize == Q.front) {
      cout << "Queue OverFlow!" << endl;
     }
     Q.elem[Q.rear] = x;
     Q.rear = (Q.rear + 1) % Q.queueSize;
    }

    // 出队列
    void outputQueue(circlQueue &Q,int &e) {
     // 栈空
     if (Q.front == Q.rear) {
      cout << "Queue Empty!" << endl;
     }
     e = Q.elem[Q.front];
     Q.front = (Q.front + 1) % Q.queueSize;
    }

    void BFS_Traverse(MGraph &G) {
     int v;
     for (int i = 0; i < G.vexnum; i++) {
      visited[i] = 0;
     }

     circlQueue Q;
     initQueue(Q);

     for (int i = 0; i < G.vexnum; i++) {
      if (!visited[i]) {
       cout << G.vexs[i] << " ";
       visited[i] = 1;
       enterQueue(Q, i);
       while (Q.front != Q.rear) {
        outputQueue(Q, v);
        for (int j = 0; j < G.vexnum; j++) {
         // 将当前节点v的全部邻接节点全部访问并入队列
         if (G.edges[v][j] && (!visited[j])) {
          cout << G.vexs[j] << " ";
          visited[j] = 1;
          enterQueue(Q, j);
         }
        }
       }

      }
     }
    }

    int main() {
     MGraph G;
     int n, e;
     cout << "输入顶点个数:" << endl;
     cin >> n;
     cout << endl;
     cout << "输入边的条数:" << endl;
     cin >> e;
     cout << endl;
     CreateUDG(G, n, e);
     cout << "深度优先遍历结果:" << endl;
     DFS_Traverse(G);
     cout << endl;
     cout << "广度优先遍历结果:" << endl;
     BFS_Traverse(G);

     system("pause");
     return 0;

    }

  • 相关阅读:
    python 可变数据类型&不可变数据类型
    java异常 总结
    java 进制转换
    在virtualbox下使用vm映像文件
    关于C语言中单双引号的问题
    php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
    fastadmin model关联模型 关联查询问题
    php 解决跨域问题
    微信支付相关
    TP5之事务处理
  • 原文地址:https://www.cnblogs.com/codingtao/p/6429636.html
Copyright © 2020-2023  润新知