zoukankan      html  css  js  c++  java
  • 图的广度优先遍历(邻接表)

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    
    #define MAX 100
    
    typedef struct EdgeNode// 边表结点
    {
        int adjves;//存储顶点的下标
        struct EdgeNode* next;//连接下一个邻点
    }EdgeNode;
    
    typedef struct VertexNode//顶点表结点
    {
        int ves;//顶点的值
        EdgeNode* firstedge;//相连的顶点的值
    }VertexNode,AdjList[MAX];
    //邻接表
    typedef struct
    {
        AdjList adjlist;
        int ves;//顶点
        int edge;//
        int book[MAX];//判断是否有被访问过
    }MGraph;
    
    void createMGraph(MGraph *G)
    {
        int i;
        int start;
        int end;
    
        EdgeNode *e;
    
        printf("please input the ves and edge:
    ");
        scanf("%d%d",&(G->ves),&(G->edge));
    //初始化
        printf("please input the ves:
    ");//此处设置顶点与存储下标相同且从零开始 
    
        for(i = 0; i < G->ves; i++)//输入顶点
        {
            scanf("%d",&(G->adjlist[i].ves));
            G->adjlist[i].firstedge = NULL;
        }
    //创建邻接矩阵
    
        printf("please input the edges:
    ");
        for(i = 0; i < G->edge; i++)
        {
            scanf("%d%d",&start,&end);
    
            e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空间
            e->adjves = end;
            e->next = G->adjlist[start].firstedge;
            G->adjlist[start].firstedge = e;//类似于链表的前插
    
    
            e =(EdgeNode*)malloc(sizeof(EdgeNode));//分配空间
            e->adjves = start;
            e->next = G->adjlist[end].firstedge;
            G->adjlist[end].firstedge = e;//类似于链表的前插
        }
    }
    
    void bfs(MGraph *G,int ves)
    {
        queue<VertexNode> Q;
        Q.push(G->adjlist[ves]);
        G->book[ves] = 1;
        while(!Q.empty()){
            VertexNode tmp = Q.front();
            printf("%d ", tmp.ves);
            Q.pop();
            EdgeNode *p = tmp.firstedge;
            while(p != NULL){
                if(G->book[p->adjves] == 0){
                    Q.push(G->adjlist[p->adjves]);
                    G->book[p->adjves] = 1;
                }
                p = p->next;
            }
        }
    }
    
    void bfsTraverse(MGraph *G){
        int i;
        memset(G->book,0,sizeof(G->book));//清空标志位
        for(i = 0; i < G->ves; i++)
            if(!G->book[i])
                bfs(G, i);
    } 
    
    int main()
    {
        MGraph G;
        createMGraph(&G);
    
        bfsTraverse(&G);
        return 0;
    }
    /*
    输入样例:
    7 9
    0 1 2 3 4 5 6
    0 2
    0 3
    0 4
    1 3
    1 5
    2 3
    2 5
    4 5
    5 6
    */ 

    输入样例:给定图如下 
    这里写图片描述

    在关于bfs的代码编写的时候发现了自己 ->操作符和 .操作符乱用,下面作出说明:

    比如你有这个结构体:

    struct xx
    {
      int a;
      int b;
    }yy, *kk;

    那么使用如下:

    yy.a = 3,  yy.b = 5;
    kk = new xx;
    kk->a = 4, kk->b = 6;

    也就是说你用结构体定义了一个实体,那么这个实体要引用他里面的成员,就用.操作符

    如果你用结构体定义的是一个结构指针,那么要引用他里面的成员就用->

    typedef struct VertexNode//顶点表结点
    {
        int ves;//顶点的值
        EdgeNode* firstedge;//相连的顶点的值
    }VertexNode,AdjList[MAX];
    .
    .
    .
    void bfs(MGraph *G,int ves)
    {
        queue<VertexNode> Q;
        Q.push(G->adjlist[ves]);
        G->book[ves] = 1;
        while(!Q.empty()){
            VertexNode tmp = Q.front();
            printf("%d ", tmp.ves);
            Q.pop();
            EdgeNode *p = tmp.firstedge;
            while(p != NULL){
                if(G->book[p->adjves] == 0){
                    Q.push(G->adjlist[p->adjves]);
                    G->book[p->adjves] = 1;
                }
                p = p->next;
            }
        }
    }

    结合上述代码,VertexNode 结构体中定义了AdjList[MAX]实体数组

    所以队列声明为 queue<VertexNode> Q; 而不是 queue<VertexNode*> Q;

    所以类似声明 VertexNode tmp = Q.front();

    继而 tmp 的相关操作使用操作符 .

  • 相关阅读:
    变量的创建和初始化
    HDU 1114 Piggy-Bank (dp)
    HDU 1421 搬寝室 (dp)
    HDU 2059 龟兔赛跑 (dp)
    HDU 2571 命运 (dp)
    HDU 1574 RP问题 (dp)
    HDU 2577 How to Type (字符串处理)
    HDU 1422 重温世界杯 (dp)
    HDU 2191 珍惜现在,感恩生活 (dp)
    HH实习 acm算法部 1689
  • 原文地址:https://www.cnblogs.com/exciting/p/10106327.html
Copyright © 2011-2022 走看看