C/C++实现图的广度和深度遍历

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>
#include<iostream> 
#include<deque>

using   namespace   std;

template <typename T> class Graph
{
    private:
        int Ne,Nv;//Nv为顶点数,Ne为边数
        T   *weight;//wieght为权重数组
        char    *data;//data保存顶点数据
        int     *visited;//用于遍历 
        void    coreDFS(int j)
        {
            for(int i=0;i<Nv;i++)
            {
                if(*(weight+j*Nv+i)==1 && !visited[i])//有邻接点
                {
                    printf("%c",data[i]);
                    visited[i]=true;
                    coreDFS(i);//找下一个节点并打印
                } 
            }   
        }
    public:
        Graph(int numV)
        {
            Nv = numV;
            Ne = 0;
            weight = (T*)calloc(numV*numV*sizeof(int),1);
            data = (char*)calloc(numV,1);
            visited = (int*)calloc(numV*sizeof(int),1);

            //初始化数据 
        }
        bool    initVertexData(const char *d)
        {

            if(strlen(d)>=Nv){
                strncpy(data,d,Nv);//只复制Nv个节点数据 
                return true;
            }else{
                return false;
            }

        }
        bool    insertEdge(char i,char j,T w)//有向图还是无向图 
        {
                int pi = strchr(data,i)-data;
                int pj = strchr(data,j)-data;
                if(pi<Nv&&pj<Nv){
                    *(weight+pi*Nv+pj) = w;
                    *(weight+pj*Nv+pi) = w;
                    Ne++;//边数加1 
                    return true;
                }else{
                    return false;
                }
        }

        void    DFS()
        {
                memset(visited,0,Nv*sizeof(int));
                printf("\n");
                for(int i=0;i<Nv;i++)//对每个节点做一次深度遍历 
                {
                    if(!visited[i]){
                        visited[i]=true;
                        printf("%c",data[i]);
                        coreDFS(i);
                    }
                }
                printf("\n");
        }
        void     BFS()
        {
                memset(visited,0,Nv*sizeof(int));//标记为没有访问过
                deque<int>  q;
                printf("\n");
                for(int i=0;i<Nv;i++)//进行广度优先搜索 
                {
                    q.push_back(i);
                    while(!q.empty())
                    {
                        int k = q.front();
                        q.pop_front(); 
                        if(!visited[k]){//没有访问,先访问 
                            printf("%c",data[k]);
                            visited[k]=true;//标记为已访问 
                        }
                        for(int j=0;j<Nv;j++){
                            if(*(weight+i*Nv+j)==1 && !visited[j]){
                                printf("%c",data[j]);
                                visited[j] = true;
                                q.push_back(j);//下一次要遍历的顶点 
                            }
                        }
                    }
                }
                printf("\n");
        }
        void    showSelf()
        {
                for(int i=0;i<Nv;i++)
                {
                    for(int j=0;j<Nv;j++)
                    {
                        printf("%d\t",*(weight+i*Nv+j));
                    }
                    printf("\n");
                }
        }//用于调试,打印邻接表 
};


int main()  
{  

    Graph<int>  g = Graph<int>(5);//建立一个有5个顶点的图,weight为int型
    g.initVertexData("abcde");
    g.insertEdge('a','b',1);
    g.insertEdge('a','c',1);
    g.insertEdge('c','e',1);
    g.insertEdge('a','d',1);
    g.insertEdge('e','d',1);
    cout << "深度遍历:";
    g.DFS();
    cout << "广度遍历:";
    g.BFS();g.showSelf();
    return 0;  
}  

遍历的图:
《C/C++实现图的广度和深度遍历》
结果:
《C/C++实现图的广度和深度遍历》

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