图的遍历

  • 邻接矩阵的DFS

    const int MAXN = 100;
    bool visited[MAXN];
    
    struct MGraph
    {
      int vexs[MAXN];//顶点表
      int arc[MAXN][MAXN];//邻接矩阵
      int numEdges, numVertexes;//边,点的数量
    };
    
    void DFS(MGraph *G,int i)
    {
      int j;
      visited[i] = 1;
      cout << G->vexs << ' ';//输出节点信息也可以进行其他操作
      for (j = 0; j < G->numVertexes; j++)
          if (G->arc[i][j] == 1 && !visited[j])
              DFS(G, j);
    }
    
    void DFSTraverse(MGraph *G)
    {
      int i;
      for (i = 0; i < G->numVertexes; i++)//初始化
          visited[i] = 0;
      for (i = 0; i < G->numVertexes; i++)
          if (!visited[i])//未访问过的顶点调用DFS,若是连通图,则只执行一次
              DFS(G, i);
    }
  • 邻接表的DFS

    const int MAXN = 100;
    bool visited[MAXN];
    
    struct EdgeNode
    {
      int adjvex;
      EdgeNode *next;
    };
    
    struct VexNode
    {
      int data;
      EdgeNode *firstedge;
    };
    
    struct Grapha
    {
      VexNode list[MAXN];
      int numVertexes, numEdges;
    };
    
    void DFS(Grapha *G, int i)
    {
      EdgeNode *p;
      visited[i] = 1;
      cout << G->list[i].data << ' ';//输出节点信息,也可以进行其他操作
      p = G->list[i].firstedge;
      while (p)
      {
          if (!visited[p->adjvex])
              DFS(G, p->adjvex);
          p = p->next;
      }
    }
    
    void DFSTraverse(Grapha *G)
    {
      for (int i = 0; i < G->numVertexes; i++)//初始化
          visited[i] = 0;
      for (int i = 0; i < G->numVertexes; i++)//若为连通图,只执行一次
          if (!visited[i])
              DFS(G, i);
    }
  • 邻接矩阵的BFS

    const int MAXN = 1000;
    int visited[MAXN];
    
    struct MGraph
    {
      int vexs[MAXN];//顶点表
      int arc[MAXN][MAXN];//邻接矩阵
      int numEdges, numVertexes;//边,点的数量
    };
    
    void BFSTraverse(MGraph G)
    {
      int i, j;
      queue<int>Q;
      for (int i = 0; i < G.numVertexes; i++)
          visited[i] = 0;
      for (int i = 0; i < G.numVertexes; i++)
      {
          if (!visited[i])
          {
              visited[i] = 1;
              cout << G.vexs[i] << ' ';
              Q.push(i);
              while (!Q.empty())
              {
                  int t = Q.front();
                  Q.pop();
                  for (int j = 0; j < G.numVertexes; j++)
                  {
                      if (G.arc[t][j] == 1 && !visited[j])
                      {
                          visited[j] = 1;
                          cout << G.vexs[j] << ' ';
                          Q.push(j);
                      }
                  }
              }
          }
      }
    }
  • 邻接表的BFS

    const int MAXN = 1000;
    int visited[MAXN];
    
    struct EdgeNode           //边表节点
    {
      int adjvex;//邻接点域(有向图中弧头下标)
      EdgeNode *next;//指向下一个边表
    };
    struct VertexNode     //顶点表节点
    {
      char data;//顶点域
      EdgeNode *firstedge;//边表头指针
    };
    
    struct GraphAdjList//图
    {
      VertexNode adjList[MAXN];//顶点表数组
      int numVertexea, numEdges;//图中顶点数和边数
    };
    
    void BFSTraverse(GraphAdjList G)
    {
      queue<int>Q;
      for (int i = 0; i < G.numVertexea; i++)
          visited[i] = 0;
      for (int i = 0; i < G.numVertexea; i++)
      {
          if (!visited[i])
          {
              visited[i] = 1;
              cout << G.adjList[i].data << ' ';
              Q.push(i);
              while (!Q.empty())
              {
                  int t = Q.front();
                  Q.pop();
                  EdgeNode *p = G.adjList[t].firstedge;
                  while (p)
                  {
                      if (!visited[p->adjvex])
                      {
                          visited[p->adjvex] = 1;
                          cout << G.adjList[p->adjvex].data << ' ';
                          Q.push(p->adjvex);
                      }
                      p = p->next;
                  }
              }
          }
      }
    }

转载于:https://www.cnblogs.com/JMWan233/p/11463478.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值