zoukankan      html  css  js  c++  java
  • 数据结构/PTA-邻接表存储图的广度优先遍历/图

    试实现邻接表存储图的广度优先遍历。

    函数接口定义:

    void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );

    其中LGraph是邻接表存储的图,定义如下:

    /* 邻接点的定义 */
    typedef struct AdjVNode *PtrToAdjVNode; 
    struct AdjVNode{
        Vertex AdjV;        /* 邻接点下标 */
        PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
    };
    
    /* 顶点表头结点的定义 */
    typedef struct Vnode{
        PtrToAdjVNode FirstEdge; /* 边表头指针 */
    } AdjList[MaxVertexNum];     /* AdjList是邻接表类型 */
    
    /* 图结点的定义 */
    typedef struct GNode *PtrToGNode;
    struct GNode{  
        int Nv;     /* 顶点数 */
        int Ne;     /* 边数   */
        AdjList G;  /* 邻接表 */
    };
    typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */

    函数BFS应从第S个顶点出发对邻接表存储的图Graph进行广度优先搜索,遍历时用裁判定义的函数Visit访问每个顶点。当访问邻接点时,要求按邻接表顺序访问。题目保证S是图中的合法顶点。

    裁判测试程序样例:

    #include <stdio.h>
    
    typedef enum {false, true} bool;
    #define MaxVertexNum 10   /* 最大顶点数设为10 */
    typedef int Vertex;       /* 用顶点下标表示顶点,为整型 */
    
    /* 邻接点的定义 */
    typedef struct AdjVNode *PtrToAdjVNode; 
    struct AdjVNode{
        Vertex AdjV;        /* 邻接点下标 */
        PtrToAdjVNode Next; /* 指向下一个邻接点的指针 */
    };
    
    /* 顶点表头结点的定义 */
    typedef struct Vnode{
        PtrToAdjVNode FirstEdge; /* 边表头指针 */
    } AdjList[MaxVertexNum];     /* AdjList是邻接表类型 */
    
    /* 图结点的定义 */
    typedef struct GNode *PtrToGNode;
    struct GNode{  
        int Nv;     /* 顶点数 */
        int Ne;     /* 边数   */
        AdjList G;  /* 邻接表 */
    };
    typedef PtrToGNode LGraph; /* 以邻接表方式存储的图类型 */
    
    bool Visited[MaxVertexNum]; /* 顶点的访问标记 */
    
    LGraph CreateGraph(); /* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
    
    void Visit( Vertex V )
    {
        printf(" %d", V);
    }
    
    void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) );
    
    int main()
    {
        LGraph G;
        Vertex S;
    
        G = CreateGraph();
        scanf("%d", &S);
        printf("BFS from %d:", S);
        BFS(G, S, Visit);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */
    
     

    输入样例:给定图如下

    2
    
     

    输出样例:

    BFS from 2: 2 0 3 5 4 1 6

    代码

    void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) )
    {
        int l=0,r=0;
        int q[10086];
        q[r++]=S;//r是队尾
        Visit(S);
        Visited[S]=true;
        PtrToAdjVNode temp;
        while(l!=r)
        {
            temp=Graph->G[q[l++]].FirstEdge;
            while(temp)
            {
                Vertex p=temp->AdjV;
                if(!Visited[p])
                {
                    Visit(p);
                    Visited[p]=true;
                    q[r++]=p;
                }
                temp=temp->Next;
            }
        }
    }
     
  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/elegantcloud/p/13944840.html
Copyright © 2011-2022 走看看