图的广度优先搜索(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 ...
随机推荐
- 优化curl并发使用
经典curl并发的处理流程:首先将所有的URL压入并发队列, 然后执行并发过程, 等待所有请求接收完之后进行数据的解析等后续处理. 在实际的处理过程中, 受网络传输的影响, 部分URL的内容会优先于其 ...
- Devexpress Ribbon
http://www.cnblogs.com/liwei81730/archive/2011/12/21/2296203.html 可查看此处.
- innerHTML on ie6-9
https://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx The innerHTML property is read-only on ...
- C#_基础:委托速讲
1定义:委托=函数指针 C# public delegate void Test(string str); 等价C++ public void (*Test)(string str): 委托赋值(初始 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 【转】我的技术学习方法 — Anytao
原文作者:anytao—王涛 他的著作:<你必须知道的.Net> 关于这个问题,也有不少刚刚入行的朋友向我问起.我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确 ...
- C++高精度计时器——微秒级时间统计
在C++中,经常需要通过计时来统计性能信息,通过统计的耗时信息,来分析性能瓶颈,通常情况下,可能毫秒级别的时间统计就足够用了,但是在毫厘必争的性能热点的地方,毫秒级别的统计还是不够的,这种情况下,就需 ...
- LVS原理与使用(1)
负载均衡,无论是否真正了解过,但我相信所有跟编程打交道的读者都有听说.同时,它(负载均衡)也是被认为一个大型网站的标识性技术之一(但负载均衡的作用肯定不止这点用途).虽然网上也有不少关于LVS配置实用 ...
- 微冷的雨ASP.NET MVC之葵花宝典(MVC)
微冷的雨ASP.NET MVC之葵花宝典 By:微冷的雨 第一章 ASP.NET MVC的请求和处理机制. 在MVC中: 01.所有的请求都要归结到控制器(Controller)上. 02.约定优于配 ...
- Worktile 技术架构概要
其实早就该写这篇博客了,一直说忙于工作没有时间,其实时间挤挤总会有的,可能就是因为懒吧!从2013年11月一直拖到现在,今天就简单谈谈 Worktile 的技术架构吧 . Worktile 自上线到现 ...