数据结构学习笔记(四) 图之邻接矩阵实现广度优先遍历

以下是用邻接矩阵存储表示,实现图的广度优先遍历的实例。
用于遍历的无向图如下:
这里写图片描述

//v0-v7依次为字符0-7
#include<iostream>
#define MaxVertexNum 8
#define MaxSize 7
using namespace std;
//抽象数据类型
typedef char vertextype;//顶点类型
typedef int edgetype;//边的权值
typedef int datatype;
//队列
typedef struct
{
    datatype Q[MaxSize];
    int front;
    int rear;
}SeqQueue;
//邻接矩阵
typedef struct
{
    vertextype vex[MaxVertexNum];//顶点表
    edgetype edge[MaxVertexNum][MaxVertexNum];//邻接矩阵,也即边表
    int n;//顶点的个数
}AMGraph;
AMGraph G;
//构造标志数组
int mark[MaxVertexNum];//标记顶点是否被遍历过

//置空队
void ClearQueue(SeqQueue &QU)
{
    QU.front=0;
    QU.rear=0;
}

//入队,使用循环队列
void EnQueue(SeqQueue &QU,datatype x)
{
    //参数检查
    if(QU.front==(QU.rear+1)%MaxSize)
    {
        cout<<"overflow!"<<endl;
        return;
    }
    QU.Q[QU.rear]=x;
    QU.rear=(QU.rear+1)%MaxSize;
}

//出队
void DeQueue(SeqQueue &QU,datatype &x)
{
    //参数检查
    if(QU.rear==QU.front)
    {
        cout<<"underflow!"<<endl;
        return;
    }
    x=QU.Q[QU.front];
    QU.front=(QU.front+1)%MaxSize;
}

//判断队是否为空,为空则返回1,不为空则返回0
int QueueEmpty(SeqQueue &QU)
{
    if(QU.rear==QU.front)
        return 1;
    return 0;
}

//构造邻接矩阵
void create(AMGraph &G)
{
    G.n=8;
    char x[8]={'0','1','2','3','4','5','6','7'};
    for(int i=0;i<8;i++)
        G.vex[i]=x[i];
    for(int i=0;i<8;i++)
        mark[i]=0;
    int c[8][8]={{0,1,1},{1,0,0,1,1},{1,0,0,0,1,1},{0,1,0,0,0,0,0,1},{0,1,0,0,0,0,0,1},
                        {0,0,1,0,0,0,0,1},{0,0,1,0,0,0,0,1},{0,0,0,1,1,1,1}};
    for(int i=0;i<8;i++)
        for(int j=0;j<8;j++)
            G.edge[i][j]=c[i][j];
}
//图的广度优先遍历
void BFS(AMGraph &G,int i)
{
    int j;
    int k;
    SeqQueue QU;
    ClearQueue(QU);
    mark[i]=1;
    EnQueue(QU,i);
    while(!QueueEmpty(QU))
    {
        DeQueue(QU,k);
        cout<<(char)G.vex[k]<<endl;
        while(G.edge[i][j]==1)
        {
            if(mark[j]==0)
            {
                mark[j]=1;
                EnQueue(QU,j);
            }
            j++;
        }
    }
}
//广度优先遍历图的算法
void BFS_Component(AMGraph &G)
{
    int i;
    for(i=0;i<G.n;i++)
        if(mark[i]==0)
            BFS(G,i);
}
//测试函数
int main()
{
    create(G);
    BFS_Component(G);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值