图的广度优先搜索(BFS)
把以前写过的图的广度优先搜索分享给大家(C语言版)
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define MAXQSIZE 100
#define OK 1
typedef char VertexType;
typedef int QElemType; typedef struct ArcNode//边结点
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode; typedef struct VNode//定义头数组
{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM]; typedef struct ALGraph//定义图
{
AdjList vertices;
int vernum,arcnum;
}ALGraph; typedef struct SqQueue
{
QElemType *base;
int front;
int rear;
}SqQueue; int CreateDG(ALGraph &G)
{
int i,j,k,v1,v2;
ArcNode *p;
printf("请输入图的节点数:");
scanf("%d",&G.vernum );
printf("请输入图的边的个数:");
scanf("%d",&G.arcnum);
for(i=;i<G.vernum;i++)
{
printf("请输入第%d个顶点数据:",i+);
getchar();
scanf("%c",&G.vertices[i].data);
//G.vertices[i].data=i;
G.vertices[i].firstarc=NULL;
}
printf("请输入节点的边关系,如:结点1和结点2有边就输入1和2(每条边就输入一次):\n");
for(k=;k<G.arcnum;k++)
{
printf("请输入第%d条边的一个结点:",k+);
scanf("%d",&v1);
printf("请输入第%d条边的另一个结点:",k+);
scanf("%d",&v2);
printf("\n");
i=v1;
j=v2;
while(i<||i>G.vernum||j<||j>G.vernum)
{
printf("请输入第%d条边的一个结点:",k+);
scanf("%d",&v1);
printf("请输入第%d条边的一个结点:",k+);
scanf("%d",&v2);
printf("\n");
i=v1;
j=v2;
}
p=(ArcNode *)malloc(sizeof(ArcNode));
if(!p)
{
printf("分配内存失败!\n");
return ;
}
p->adjvex=j-;
p->nextarc=G.vertices[i-].firstarc;
G.vertices[i-].firstarc=p;
}
return OK;
}
int InitQueue(SqQueue &Q)
{
Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
if(!Q.base)
{
printf("队列内存失败!\n");
return ;
}
Q.front=Q.rear=;
return (OK);
} int EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+)%MAXQSIZE==Q.front)
{
printf("队列已满!\n");
return ;
}
Q.base[Q.rear]=e;
Q.rear=(Q.rear+)%MAXQSIZE;
return (OK);
}
int QueueEmpty(SqQueue Q)
{
if(Q.front==Q.rear)
return (OK);
else
return ;
} int DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front==Q.rear)
{
printf("队列为空!无法删除!\n");
return ;
}
e=Q.base[Q.front];
Q.front=(Q.front+)%MAXQSIZE;
return (e);
}
void BFSTraverse(ALGraph G)
{
int i,j,k;
int visited[MAX_VERTEX_NUM];
ArcNode *p;
SqQueue Q;
for(i=;i<G.vernum;i++)
visited[i]=;
InitQueue(Q);
for(i=;i<G.vernum;i++)
{
if(visited[i]==)
{
visited[i]=;
printf("%c-->",G.vertices[i].data);
EnQueue(Q,i);
while(!QueueEmpty(Q))
{
DeQueue(Q,j);
for(k=j,p=G.vertices[j].firstarc;p!=NULL;k=p->adjvex,p=p->nextarc)
{
if(visited[k]==)
{
visited[k]=;
printf("%c-->",G.vertices[k].data);
EnQueue(Q,k);
}
}
}
}
}
}
int main()
{
ALGraph G;
CreateDG(G); printf("广度优先搜索结果为\n开始-->");
BFSTraverse(G);
printf("结束!\n");
return ;
}
运行结果截图:
图的广度优先搜索(BFS)的更多相关文章
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- ACM题目————图的广度优先搜索
题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- DS图遍历--广度优先搜索
题目描述 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
随机推荐
- Golang之chan/goroutine(转)
原文地址:http://tchen.me/posts/2014-01-27-golang-chatroom.html?utm_source=tuicool&utm_medium=referra ...
- 使用HttpClient来异步发送POST请求并解析GZIP回应
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...
- 安卓(android)之实现断点下载功能
一.建立实体类 1.文件实体类 package com.example.zjw.myapplication.dao; import java.io.Serializable; /** * 预下载文件实 ...
- web-inf目录和meta-inf目录
/WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/ 包含了站点所有用的 class 文件,包括 se ...
- Debian 8 jessie, OpenSSH ssh connection server responded Algorithm negotiation failed
安装了debian 8.5 就出问题了. root@debian8:~# lsb_release -aNo LSB modules are available.Distributor ID: Debi ...
- 关于ajax为什么会返回php整个源码
ajax 程序:返回的是php文件输出的代码. 1. 注意:如果你的php文件包含了html代码或者说是输出了HTML代码,它都会返回给 AJAX. 2. 注意:是整个php文件.这意味着如果你的aj ...
- MAC系统设置SSX教程与下载
http://ss.hongxingchajian.com MAC系统设置SSX教程与下载 1.下载客户端并安装,装完后打开 链接: http://pan.baidu.com/s/1o7ypp5g 密 ...
- 在update语句中使用子查询
在update 中的 where 子句中使用子查询: UPDATE mg_page_log as a SET page_num=1 WHERE id in( SELECT id from mg_ ...
- Android事件分发传递
一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev); 接收到触摸事件时,是否分发事件到下面的View 返回true:分发触摸事件 返回f ...
- JSP实现在项目在网页上查询
<table> <caption>user</caption> <tr> <td>编号</td> <td>姓名< ...