QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

管理团队

Rank: 30Rank: 30Rank: 30Rank: 30

技术值
查看: 908|回复: 15

[学习笔记] ★ 第六十一讲 图的遍历|【广度优先遍历】★

[复制链接]
最佳答案
139 
累计签到:662 天
连续签到:190 天
不二如是 发表于 2017-11-27 14:03:30 90815 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 不二如是 于 2017-11-27 14:03 编辑


                               
登录/注册后可看大图


    


用一节课的时间,提高生活幸福感

------小甲鱼


欢乐傻笑并存

智慧邪恶同在


笔记内涵------





广度优先遍历


广度优先遍历(BreadthFirstSearch)
,又称为广度优先搜索,简称BFS

如果以之前我们找钥匙的例子来讲:
        运用深度优先遍历意味着要先彻底查找完一个房间再开始另一个房间的搜索。
Snip20171127_185.png


但我们知道,钥匙放在沙发地下等犄角旮旯的可能性极低,因此我们运用新的方案:
        先看看钥匙是否放在各个房间的显眼位置,如果没有,再看看各个房间的抽屉有没有。
Snip20171127_186.png


这样逐步扩大查找的范围的方式我们称为广度优先遍历。

那么要实现对图的广度遍历,我们可以利用队列来实现
Snip20171127_187.png


代码实现:
游客,如果您要查看本帖隐藏内容请回复




这位鱼油,如果喜欢本系列笔记,请订阅 专辑传送门)(不喜欢更要订阅

本帖被以下淘专辑推荐:

楼层
跳转到指定楼层
最佳答案
0 

尚未签到

帅气的co 发表于 2017-11-27 14:11:09 | 显示全部楼层
,,
最佳答案
0 
累计签到:51 天
连续签到:1 天
yms 发表于 2017-11-27 18:29:23 | 显示全部楼层
你也开始整理数据结构笔记了
最佳答案
0 

尚未签到

mncaicai 发表于 2017-11-27 20:52:45 | 显示全部楼层
666666666666
最佳答案
0 
累计签到:6 天
连续签到:2 天
shangan 发表于 2017-12-2 23:25:43 | 显示全部楼层
最佳答案
0 
累计签到:2 天
连续签到:1 天
S君zzz 发表于 2017-12-5 18:32:15 | 显示全部楼层
666
最佳答案
0 

尚未签到

2541996178 发表于 2017-12-8 17:02:15 | 显示全部楼层
学习学习
最佳答案
0 
累计签到:20 天
连续签到:1 天
啊哦啊 发表于 2017-12-26 17:14:03 | 显示全部楼层

最佳答案
0 
累计签到:6 天
连续签到:1 天
圣狄雅哥 发表于 2018-4-21 18:57:28 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100                        // 最大顶点数
#define FALSE 0
#define TRUE 1
typedef int Boolean;        // 这里我们定义Boolean为布尔类型,其值为TRUE或FALSE
Boolean visited[MAXVEX];
typedef  int ElemType;

typedef struct
{
        char vexs[MAXVEX];                                // 顶点表
        int arc[MAXVEX][MAXVEX];                // 邻接矩阵
        int numVertexes, numEdges;                // 图中当前的顶点数和边数
} MGraph;

typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct {
    QueuePtr front, rear; // 队头、尾指针
} LinkQueue;

void initQueue(LinkQueue *q)
{
    q->front=q->rear=(QueuePtr)malloc(sizeof(QNode));
    if( !q->front )
    exit(0);
    q->front->next = NULL;
}

void EnQueue(LinkQueue *q, ElemType e)
{
QueuePtr p;
p = (QueuePtr)malloc(sizeof(QNode));
if( p == NULL )
exit(0);
p->data = e;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}

int DeQueue(LinkQueue *q, ElemType *e)
{
QueuePtr p;
if( q->front == q->rear )
return 0;
p = q->front->next;
*e = p->data;
q->front->next = p->next;
if( q->rear == p )
q->rear = q->front;
free(p);
return 1;
}

int QueueEmpty(LinkQueue *q)
{
    if(q->front==q->rear)
        return 1;
    else return 0;
}
// 建立无向网图的邻接矩阵
void CreateMGraph(MGraph *G)
{
        int i, j, k;

        printf("请输入顶点数和边数:\n");
        scanf("%d %d", &G->numVertexes, &G->numEdges);
        printf("请输入各个顶点:\n");
        for( i=0; i < G->numVertexes; i++ )
        {
                scanf("%c", &G->vexs[i]);
        }

        for( i=0; i < G->numVertexes; i++ )
        {
                for( j=0; j < G->numVertexes; j++ )
                {
                        G->arc[i][j] =0;                        // 邻接矩阵初始化
                }
        }

        for( k=0; k < G->numEdges; k++ )
        {
                printf("请输入边(Vi,Vj)上的下标i,并将权标为1表示连通:\n");
                fflush(stdin);
                scanf("%d %d", &i, &j);
                G->arc[i][j] = 1;
                G->arc[j][i] = G->arc[i][j];                        // 是无向网图,对称矩阵
        }
}

void PrintVexs(MGraph*G)
{
    int i,j;
    printf("当前无向图的邻接矩阵为:\n");
    for(i=0;i<G->numVertexes;i++)
    {
        for(j=0;j<G->numVertexes;j++)
        {
            printf("%2d ",G->arc[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

void BFSTraverse(MGraph *G)
{
    int i,j;
    LinkQueue Q;
    for(i=0;i<G->numVertexes;i++)
    {
        visited[i]=FALSE;
    }
    initQueue(&Q);
    for(i=0;i<G->numVertexes;i++)
    {
        if(!visited[i])
        {
            printf("%c ",G->vexs[i]);
            visited[i]=TRUE;
            EnQueue(&Q,i);
            while(!QueueEmpty(&Q))
            {
                DeQueue(&Q,&i);
                for(j=0;j<G->numVertexes;j++)
                {
                    if(G->arc[i][j]==1&&!visited[j])
                    {
                         printf("%c",G->vexs[i]);
                         visited[i]=TRUE;
                         EnQueue(&Q,i);
                    }
                }
            }
        }
    }
}

int main()
{
    MGraph*G;
    G=(MGraph*)malloc(sizeof(MGraph));
    CreateMGraph(G);
    PrintVexs(G);
    BFSTraverse(G);
    printf("\n");
    return 0;
}
最佳答案
0 
累计签到:6 天
连续签到:1 天
圣狄雅哥 发表于 2018-4-21 18:58:35 | 显示全部楼层
组织了一下上面的代码,发现运行不了,也检查不出错误,哪位帮忙调调
最佳答案
10 
累计签到:72 天
连续签到:19 天
溯影 发表于 2018-4-21 22:30:32 | 显示全部楼层
最佳答案
0 
累计签到:5 天
连续签到:1 天
磨牙耗子 发表于 2018-5-4 16:47:46 | 显示全部楼层
最佳答案
10 
累计签到:72 天
连续签到:19 天
溯影 发表于 2018-5-5 10:08:48 | 显示全部楼层
学习一下
最佳答案
0 

尚未签到

carlgood 发表于 2018-5-10 09:56:02 | 显示全部楼层
学习一下,多谢分享
最佳答案
0 
累计签到:38 天
连续签到:33 天
刘亮 发表于 2018-5-18 15:18:08 | 显示全部楼层
刚好学到这里,进来学习一下。
最佳答案
0 
累计签到:7 天
连续签到:1 天
菜菜爱生活 发表于 4 天前 | 显示全部楼层
好久没来

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /1 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2018-5-27 09:26

快速回复 返回顶部 返回列表