不二如是 发表于 2017-11-27 14:03:30

★ 第六十一讲 图的遍历|【广度优先遍历】★

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

http://xxx.fishc.com/forum/201709/05/221714xccynsdzifbskndw.jpg

{:10_254:}{:10_254:} 索引帖 {:10_254:}{:10_254:}

用一节课的时间,提高生活幸福感
------小甲鱼

欢乐与傻笑并存

智慧与邪恶同在

笔记内涵------



广度优先遍历

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

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


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


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

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


代码实现:
**** Hidden Message *****



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

yms 发表于 2017-11-27 18:29:23

你也开始整理数据结构笔记了

mncaicai 发表于 2017-11-27 20:52:45

666666666666

shangan 发表于 2017-12-2 23:25:43

{:10_277:}

S君zzz 发表于 2017-12-5 18:32:15

666

2541996178 发表于 2017-12-8 17:02:15

学习学习

啊哦啊 发表于 2017-12-26 17:14:03


圣狄雅哥 发表于 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;
typedefint ElemType;

typedef struct
{
      char vexs;                              // 顶点表
      int arc;                // 邻接矩阵
      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);
      }

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

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

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);
      }
      printf("\n");
    }
    printf("\n");
}

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

int main()
{
    MGraph*G;
    G=(MGraph*)malloc(sizeof(MGraph));
    CreateMGraph(G);
    PrintVexs(G);
    BFSTraverse(G);
    printf("\n");
    return 0;
}

圣狄雅哥 发表于 2018-4-21 18:58:35

组织了一下上面的代码,发现运行不了,也检查不出错误,哪位帮忙调调

溯影 发表于 2018-4-21 22:30:32

{:10_279:}

磨牙耗子 发表于 2018-5-4 16:47:46

{:10_254:}

溯影 发表于 2018-5-5 10:08:48

学习一下

carlgood 发表于 2018-5-10 09:56:02

学习一下,多谢分享

刘亮 发表于 2018-5-18 15:18:08

刚好学到这里,进来学习一下。

菜菜爱生活 发表于 2018-5-23 16:37:24

好久没来

chhch 发表于 2018-6-6 16:39:51

了解一下

猿想找个媛 发表于 2018-7-18 16:32:42

1

谁与争锋 发表于 2018-7-23 06:12:25

学习

tabuainiwoai 发表于 2018-7-31 14:18:55

学习了。

光头才是终点 发表于 2018-10-4 12:43:50

蚂蚁搬砖
页: [1] 2 3 4 5 6 7
查看完整版本: ★ 第六十一讲 图的遍历|【广度优先遍历】★