• 第六章 6.5 图的遍历


    深度优先搜索

    采用邻接矩阵表示图的深度优先搜索遍历

    #include<bits/stdc++.h>
    using namespace std;
    #define MaxInt 32767
    #define MVNum 100
    #define OK 1
    bool visited[MaxInt];
    typedef char VerTexType;
    typedef int ArcType;
    typedef int Status ;
    
    typedef struct{
        VerTexType vexs[MVNum];//存储顶点 
        ArcType arcs[MVNum][MVNum];//邻接矩阵 
        int vexnum,arcnum;//图的当前顶点数和边数 
    }AMGraph;
    
    int LocateVex(AMGraph G,char v1)
    {
        for(int i = 0; i < G.vexnum  ; i ++)
        {
            if(G.vexs[i] == v1-'0')
                return i;        
        }    
    } 
    
    Status CreateUDN(AMGraph &G)
    {
        char v1,v2;
        int w,i,j;
        cin>>G.vexnum>>G.arcnum; //读入图的顶点和边数
        for( i = 0; i < G.vexnum ; i ++)
            cin>>G.vexs[i];
        for( i = 0; i < G.vexnum ; i ++)
            for( j = 0; j < G.vexnum ; j ++)
                G.arcs[i][j] = MaxInt;//初始化邻接矩阵,边的权值均置为极大值MaxInt
        for(int k = 0; k < G.arcnum ; k ++)
        {
            cin>>v1>>v2>>w;//输入一条边的顶点和权值 
            i = LocateVex(G,v1);
            j = LocateVex(G,v2);
            G.arcs[i][j] = G.arcs[j][i] = w;    
        } 
        return OK;
    }
    
    void DFS_AM(AMGraph G,int v)
    {
        cout<<v;
        visited[v] = true;//访问第v个顶点,并将标志数组置为true; 
        int w;
        for(w = 0; w < G.vexnum ; w ++)//依次检查邻接矩阵v所在的行 
        {
            if(G.arcs[v][w] != 0&& !visited[w])
            {
                DFS_AM(G,w);
            }
        }
    }
    
    int main()
    {
        AMGraph G;
        CreateUDN(G);
        DFS_AM(G,1);
        return 0;
    }

    采用邻接表表示图的深度优先搜索遍历

    #include<bits/stdc++.h>
    using namespace std;
    
    #define MVNum 100
    bool visited[MVNum];
    #define OK 0
    typedef int OhterInfo;
    typedef int VerTexType;
    typedef int Status;
    typedef struct ArcNode{//边结点 
        int adjvex;//相邻顶点信息 
        struct ArcNode *nextarc;//下一条边的指针 
        OhterInfo info;//权值 
    }ArcNode;
    
    typedef struct VNode{//存储顶点信息 
        VerTexType data;
        ArcNode *firstarc;//第一条依附该顶点的边的指针 
    }VNode,AdjList[MVNum];
    
    typedef struct{
        AdjList vertice;//结构体数组 
        int vexnum,arcnum;//图的当前顶点数和边数 
    }ALGraph;
    
    int LocateVex(ALGraph G,char ch)
    {
        for(int i = 0; i < G.vexnum ; i ++)
            if(G.vertice[i].data  == ch-'0')
                return i;
    }
    Status CreateUDG(ALGraph &G)
    {
        char v1,v2;
        ArcNode *p1,*p2;
        cin>>G.arcnum>>G.vexnum ;//读入总边数和总的顶点数
        int i,j,w;
        for(i = 0; i < G.vexnum  ; i ++)
        {
            cin>>G.vertice[i].data ;
            G.vertice[i].firstarc = NULL;
        }
        for(i = 0; i < G.arcnum ; i ++)
        {
            cin>>v1>>v2>>w;
            i = LocateVex(G,v1);
            j = LocateVex(G,v2);
            p1 = new ArcNode;
            p1->nextarc = G.vertice[i].firstarc ;
            p1->adjvex = j;
            p1->info = w;
            G.vertice[i].firstarc = p1;
            
            p2 = new ArcNode;
            p2->nextarc = G.vertice[j].firstarc ;
            p2->adjvex = i;
            p2->info = w;
            G.vertice[j].firstarc = p2;
         } 
        return OK;
    }
    
    void DFS_AL(ALGraph G,int v)
    {
        cout<<v;
        int w;
        visited[v] = true;
        ArcNode *p;
        p = G.vertice[v].firstarc ;//p指向v的边链表的第一个边结点 
        while(p !=NULL)//边结点非空 
        {
            w = p->adjvex ;
            if(!visited[w])//如果未被访问,则递归调用 
                DFS_AL(G,w);
            p = p->nextarc ;//指向下一个边结点 
        }
        return;
    }
    
    int main()
    {
        ALGraph G;
        CreateUDG(G);
        DFS_AL(G,1);
        return 0;
    }
  • 相关阅读:
    毕设2020.02.02
    架构师眼中的高并发架构
    云时代架构读后感二
    以《淘宝网》为例,描述质量属性六个常见场景
    《架构漫谈》读后感
    云时代架构读后感一
    暑假周总结报告08
    暑假周总结报告07
    暑假周总结报告06
    假期周总结报告05
  • 原文地址:https://www.cnblogs.com/hellocheng/p/8005947.html
Copyright © 2020-2023  润新知