★ 第六十一讲 图的遍历|【广度优先遍历】★
本帖最后由 不二如是 于 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:} ) 你也开始整理数据结构笔记了 666666666666 {:10_277:} 666 学习学习 看
#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;
}
组织了一下上面的代码,发现运行不了,也检查不出错误,哪位帮忙调调 {:10_279:} {:10_254:} 学习一下 学习一下,多谢分享 刚好学到这里,进来学习一下。 好久没来
了解一下 1 学习 学习了。 蚂蚁搬砖