鱼C论坛

 找回密码
 立即注册
查看: 18347|回复: 134

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

  [复制链接]
发表于 2017-11-27 14:03:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

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


                               
登录/注册后可看大图


    


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

------小甲鱼


欢乐傻笑并存

智慧邪恶同在


笔记内涵------





广度优先遍历


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

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


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


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

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


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




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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-27 18:29:23 | 显示全部楼层
你也开始整理数据结构笔记了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-27 20:52:45 | 显示全部楼层
666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-2 23:25:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-5 18:32:15 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-8 17:02:15 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-26 17:14:03 | 显示全部楼层

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-21 18:58:35 | 显示全部楼层
组织了一下上面的代码,发现运行不了,也检查不出错误,哪位帮忙调调
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-21 22:30:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-4 16:47:46 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-5 10:08:48 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 09:56:02 | 显示全部楼层
学习一下,多谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-18 15:18:08 | 显示全部楼层
刚好学到这里,进来学习一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-23 16:37:24 | 显示全部楼层
好久没来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-6 16:39:51 From FishC Mobile | 显示全部楼层
了解一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-18 16:32:42 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-23 06:12:25 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-31 14:18:55 | 显示全部楼层
学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-4 12:43:50 | 显示全部楼层
蚂蚁搬砖
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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