数据结构——图的深度/广度优先遍历

这是上一篇:图的存储方式——邻接矩阵

http://blog.csdn.net/dala_da/article/details/79302329

从整体来看,我个人认为深度优先有点类似二叉树先序遍历,都是将访问节点压入到栈,然后看是否有延伸节点,若没有则出栈,返回到上一节点;而广度优先则与二叉树层次遍历比较像,离出发节点比较近的点先被访问。因此本篇我采用非递归的方式进行图的遍历,分别采用的是站和队列的数据结构

#include<iostream>
#include<limits.h>
#include<stack>
#include<queue>

using namespace std;

#define MAXVEX 100

typedef struct
{
    int matrix[MAXVEX][MAXVEX];
    int numNodes, numEdges;
} Graph;

void CreateGraph(Graph *Gp)
{
    int i, j, k, w;
    bool isDirected;
    cout<<"无向图请输入0,有向图请输入1"<<endl;
    cin>>isDirected;
    cout<<"请输入顶点数和边数(空格分隔):"<<endl;
    cin>>Gp->numNodes>>Gp->numEdges;;
    for (i=1;i<=Gp->numNodes;i++)
    {
        for (j=1;j<=Gp->numNodes;j++)
        {
            if (i==j)
                Gp->matrix[i][j]=0;
            else
                Gp->matrix[i][j]=INT_MAX;
        }
    }
    cout<<"请输入边(vi, vj)和权值w,三个变量空格分隔即可:"<<endl;
    for (k=0;k<Gp->numEdges;k++)
    {
        cin>>i>>j>>w;
        Gp->matrix[i][j]=w;
        if(!isDirected)
            Gp->matrix[j][i]=Gp->matrix[i][j];
    }
}

void ShowGraph(Graph M){
    int i, j;
    for(i=1;i<=M.numNodes;i++){
        for(j=1;j<=M.numNodes;j++){
            if(M.matrix[i][j]!=INT_MAX)
                cout<<M.matrix[i][j]<<" ";
        else
            cout<<"*"<<" ";
        }
        cout<<endl;
    }
}

void Graph_Dfs(Graph M, int visiting_Node){
    bool *isVisited=new bool[M.numNodes];
    for(int i=1;i<M.numNodes;i++)
        isVisited[i]=false;
    int visited_count=0;//记录已经访问过的节点
    stack<int> p;
    while(visited_count<M.numNodes){
        if(isVisited[visiting_Node]==false){
            cout<<visiting_Node<<" ";
            visited_count++;
        }
        p.push(visiting_Node);
        isVisited[visiting_Node]=true;
        int j;
        for(j=1;j<=M.numNodes;j++){
            if(M.matrix[visiting_Node][j]!=0 && M.matrix[visiting_Node][j]!=INT_MAX && isVisited[j]==false )
                break;
        }
        if(j==M.numNodes+1){
            p.pop();
            if(!p.empty()){
                visiting_Node=p.top();
                p.pop();
            }
            else
                break;
        }
        else
            visiting_Node=j;
    }
}

void Graph_Bfs(Graph M, int visiting_Node){
    bool *isVisited=new bool[M.numNodes];
    for(int i=1;i<M.numNodes;i++)
        isVisited[i]=false;
    int visited_count=0;//记录已经访问过的节点
    queue<int> p;
    while(visited_count<M.numNodes){
        if(isVisited[visiting_Node]==false){
            cout<<visiting_Node<<" ";
            visited_count++;
        }
        isVisited[visiting_Node]=true;
        p.push(visiting_Node);
        for(int j=1;j<=M.numNodes;j++){
            if(M.matrix[visiting_Node][j]!=0 && M.matrix[visiting_Node][j]!=INT_MAX && isVisited[j]==false){
                p.push(j);
            }
        }
        p.pop();
        visiting_Node=p.front();
    }
}

int main(void)
{
    Graph M;
    CreateGraph(&M);
    cout<<"邻接矩阵为:"<<endl;
    ShowGraph(M);

    cout<<"该图的深度遍历为:"<<endl;
    Graph_Dfs(M,1);

    cout<<endl;

    cout<<"该图的广度遍历为:"<<endl;
    Graph_Bfs(M,1);

    return 0;
}

运行结果:

《数据结构——图的深度/广度优先遍历》

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/dala_da/article/details/79314107
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞