zoukankan      html  css  js  c++  java
  • 第六章 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;
    }
  • 相关阅读:
    LeetCode: Binary Search Tree Iterator 解题报告
    LeetCode: Search Insert Position 解题报告
    LeetCode: Search a 2D Matrix 解题报告
    LeetCode: Distinct Subsequences 解题报告
    LeetCode: Pascal's Triangle II 解题报告
    LeetCode: Pascal's Triangle 解题报告
    LeetCode: Valid Palindrome 解题报告
    LeetCode: Palindrome 回文相关题目
    K8S使用入门-创建第一个容器
    Prometheus监控实战day2——监控主机和容器
  • 原文地址:https://www.cnblogs.com/hellocheng/p/8005947.html
Copyright © 2011-2022 走看看