图的广度优先遍历(代码实现)

领接矩阵实现

#include"stdio.h"
#include"stdlib.h"
typedef enum{FALSE,TRUE} Boolean;
#define MaxVertexNum 10     /*定义最大顶点数*/
typedef int Vertex;/* 用顶点下标表示顶点,为整型 */
typedef struct{
    int arcs[MaxVertexNum][MaxVertexNum]; /*邻接矩阵*/
    int vexnum,arcnum; /*图中的顶点数vexnum和边数arcnum*/
}MGraph; /*用邻接矩阵表示的图的类型*/
Boolean visited[MaxVertexNum]; /* 顶点的访问标记 */
void CreatMGraph(MGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void BFS(MGraph G,Vertex v);
int main()
{
    Vertex v;
    MGraph G;
    CreatMGraph(&G);
    scanf("%d", &v);
    printf("BFS from %d:",v);
    BFS(G,v);     
    return 0;
}
/* 你的代码将被嵌在这里 */

具体代码如下:

void BFS(MGraph G,Vertex i)
{
    int q[MaxVertexNum],front=0,rear=0;//定义一个数组队列
    printf(" %d",i);
    visited[i]=1;//已经访问的做个标记1
    q[rear++]=i;//第一个顶点进队列。尾指针后移
    while(front!=rear)//队列不为空
    {
        int now=q[front++];//当前结点处,用now记录进行操作
        for(i=0;i<G.vexnum;i++)//对所有结点操作
        {
            if(G.arcs[now][i]==1&&visited[i]==0)//如果它们是临界的,也就是这一行为1的,且没有被访问过的,就访问它,再放入队列去
            {
                printf(" %d",i);
                visited[i]=1;
                q[rear++]=i;
            }
        }
    }
}

邻接表实现

#include"stdio.h"
#include"stdlib.h"
#define MAX_VERTEX_NUM 10      /*定义最大顶点数*/
typedef int Vertex;
typedef struct  ArcNode{       /*表结点*/
    int adjvex;               /*邻接点域*/
    struct  ArcNode *nextarc; /*指向下一个表结点*/
}ArcNode;
typedef struct VNode{           /*头结点*/
    Vertex data;                  /*顶点域*/
    ArcNode *firstarc;          /*指向第一个表结点*/
}VNode,AdjList[MAX_VERTEX_NUM]; /*AdjList是数组类型*/
typedef struct { 
    AdjList vertices;           /*邻接表中数组定义*/
    int vexnum,arcnum;          /*图中当前顶点数和边数*/
} ALGraph;                 /*图类型*/
typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MAX_VERTEX_NUM];/*定义标志向量,为全局变量*/
void CreatALGraph(ALGraph *G);/* 创建图并且将Visited初始化为false;裁判实现,细节不表 */
void BFS(ALGraph *G,int v);
int main()
{
    Vertex v;
    ALGraph G;
    CreatALGraph(&G);
    scanf("%d", &v);
    printf("BFS from %d:",v);
    BFS(&G,v);     
    return 0;
}
/* 你的代码将被嵌在这里 */

具体代码如下:

void BFS(ALGraph *G,int i)
{
    int q[100];
    int f=0,r=0;
    printf(" %d",i);
    visited[i]=1;
    q[r++]=i;//i入队列
    while(f!=r)
    {
        int v=q[f++];//出队列送给了v
        for(ArcNode *p=G->vertices[v].firstarc;p!=NULL;p=p->nextarc)
        {
            int w=p->adjvex;
            if(!visited[w])
            {
                printf(" %d",w);
                visited[w]=1;
                q[r++]=w;//w入队列
            }
        }
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值