图论之广度优先遍历

//邻接矩阵版
#include <stdio.h>
#include <queue>
using namespace std;

#define MAXVEX 100                      //最大顶点数,应由用户定义
#define INFINITY 65535                  //用65535来代表∞

bool visited[MAXVEX];                    //访问标志数组
typedef char VertexType;                 //顶点类型应用户定义
typedef int  EdgeType;                   //边上的权值应由用户定义
typedef int InforType;                   //信息的类型由用户定义

typedef struct Graph{
    VertexType vexs[MAXVEX];            //顶点表
    EdgeType arc[MAXVEX][MAXVEX];       //邻接矩阵,可看作边
    int numVertexes, numEdge;           //图中当前的顶点数和边数
}Graph;

//邻接矩阵的广度遍历算法
void BFS(Graph g)
{
    int i, j;
    queue <int> q;
    for(i = 0; i < g.numVertexes; i++)
        visited[i] = false;
    for(i = 0; i < g.numVertexes; i++)
    {
        if(!visited[i])                 //若是未访问过
        {
            visited[i] = true;
            printf("%c ", g.vexs[i]);   //打印结点,也可以其他操作
            q.push(i);
            while(!q.empty())
            {
                int m = q.front;
                q.pop();
                for(j = 0; j < g.numVertexes; j++)
                {
                    if(g.arc[m][j] == 1 && !visited[j])//如果有边,找到邻接点j,且没有访问过j结点
                    {
                        visited[j] = true;
                        printf("%c ", g.vexs[j]);
                        q.push(j);

                    }
                }
            }
        }
    }
}


//邻接表版
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;

#define MAXVEX 100                      //最大顶点数,应由用户定义
#define INFINITY 65535                  //用65535来代表∞

bool visited[MAXVEX];                    //访问标志数组
typedef char VertexType;                //顶点类型应用户定义
typedef int  EdgeType;                  //边上的权值应由用户定义
typedef int InforType;                  //信息的类型由用户定义

typedef struct EdgeNode                //边表结点
{
    int adjvex;                        //邻接点域,存储该顶点对应的下标
    EdgeType weight;                   //用于存储权值,对于非网图可以不需要
    struct EdgeNode *next;             //链域,指向下一个邻接点
}EdgeNode;

typedef struct VertexNode              //顶点表结点
{
    VertexType data;                   //顶点域,存储顶点信息
    EdgeNode *firstedge;               //边表头指针  建立边表
}VertexNode;

typedef struct GraphAdjlist
{
    VertexNode adjlist[MAXVEX];        //建立顶点表
    int numVertex, numEdge;            //图中当前顶点数和边数
}GraphList;

//邻接矩阵的广度遍历算法
void BFSTraverse(GraphList g)
{
    int i, j;
    EdgeNode * p;
    queue <int> q;
    for(i = 0; i < g.numVertex; i++)
        visited[i] = false;
    for(i = 0; i < g.numVertex; i++)
    {
        if(!visited[i])
        {
            visited[i] = true;
            printf("%c ", g.adjlist[i].data);   //打印顶点,也可以其他操作
            q.push(i);               //将这个点入队
            while(!q.empty())
            {
                int m = q.front();
                q.pop();
                p = g.adjlist[m].firstedge;
                while(p)
                {
                    if(!visited[p->adjvex])
                    {
                        visited[p->adjvex] = true;
                        printf("%c ", g.adjlist[p->adjvex].data);
                        q.push(p->adjvex);
                    }
                    p = p->next;
                }
            }
        }
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值