zoukankan      html  css  js  c++  java
  • 图的深搜和广搜

    #include<iostream>
    #include<queue>
    using namespace std;
    #define VERTEX_MAX 20
    
    
    bool visted[VERTEX_MAX];
    
    typedef struct node {
        int adjvex;                         //顶点的位置
        struct node * next;             //指向下一条边的指针
    }EdgeNode;
    
    typedef struct vnode {
        char vertex;
        EdgeNode *firstedge;
    }AdjList[VERTEX_MAX];
    
    typedef struct {
        AdjList vertexs;                    //邻接表
        int verNum, edgeNum;            //图中顶点和边的数量
    }Graph;
    
    /*****************************************************
    *
    *        建立图的邻接表
    *
    ******************************************************/
    
    void CreateGraph(Graph *G) {
        int v1, v2, i, j, k;
        cout<<"请输入图的顶点数n和边数e:"<<endl;
        cin>>G->verNum>>G->edgeNum;
        cout<<"请输入每个顶点的编号"<<endl;
    
        for( i = 0; i < G->verNum; i++)
        {
            cin>>G->vertexs[i].vertex;
            G->vertexs[i].firstedge = NULL;
        }
        cout<<"请输入每条边对应的顶点:"<<endl;
        EdgeNode *p;
        for(k = 0; k < G->edgeNum; k++)
        {
            cin>>i>>j;
            p = new node;
            p->adjvex = j - 1;
            p->next = G->vertexs[i - 1].firstedge;
            G->vertexs[i - 1].firstedge = p;
        }
    
    }
    /****************************************************
    *
    * 深搜
    *
    *****************************************************/
    
    void DFSTraverse(Graph *G, int v)
    {
        visted[v] = true;
        cout<<G->vertexs[v].vertex<<"->";
        EdgeNode *p =  G->vertexs[v].firstedge;
        while( p != NULL)
        {
            if(!visted[p->adjvex])
            {
                DFSTraverse(G, p->adjvex);
            }
            p = p->next;
        }
    }
    
    void DFS(Graph *G)
    {
        for(int i = 0; i < G->verNum; i++)
        {
            visted[i] = false;
        }
        cout<<"深搜:";
        for(int i = 0; i < G->verNum; i++)
        {
            if(!visted[i])
            {
                DFSTraverse(G, i);
            }
        }
        cout<<"null\n";
    }
    
    /**************************************************
    *
    * 广搜
    *
    **************************************************/
    
    void BFS(Graph *G)
    {
        queue<int > q;
        EdgeNode *p;
        for(int i = 0; i < G->verNum; i++)
        {
            visted[i] = false;
        }
        cout<<"广搜: ";
        for(int i = 0; i < G->verNum; i++)
        {
            if(!visted[i])
            {
                visted[i] = true;
                cout<<G->vertexs[i].vertex<<"->";
                q.push(i);
                while(!q.empty())
                {
                    int j = q.front();
                    q.pop();
                    p = G->vertexs[j].firstedge;
                    while(p)
                    {
                        if(!visted[p->adjvex])
                        {
                            cout<<G->vertexs[p->adjvex].vertex<<"->";
                            visted[p->adjvex] = true;
                            q.push(p->adjvex);
                        }
                        p = p->next;
                    }
                }
            }
        }
        cout<<"null\n";
    }
    
    int main()
    {
        Graph *G = new Graph;
        CreateGraph(G);
        DFS(G);
        BFS(G);
        return 0;
    }
    

      

  • 相关阅读:
    设计模式のPrototypePattern(原型模式)----创建模式
    设计模式のBuilderPattern(创建者模式)----创建模式
    设计模式のSingleton Pattern(单例模式)----创建模式
    设计模式のAbstractFactory(虚拟工厂)----创建模式
    设计模式のFactoryPattern(工厂模式)----创建模式
    日文键盘改英文键盘
    [转]CString转char * ,string
    linux下添加PATH环境变量
    Windows异步套接字(WSASocket)
    【转载】va_start和va_end使用详解
  • 原文地址:https://www.cnblogs.com/genslow/p/2533414.html
Copyright © 2011-2022 走看看