把以前写过的图的广度优先搜索分享给大家(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)的更多相关文章

  1. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  2. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  3. ACM题目————图的广度优先搜索

    题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...

  4. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  5. 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

    前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...

  6. DS图遍历--广度优先搜索

    题目描述 代码框架如下: 输入 第一行输入t,表示有t个测试实例 第二行输入n,表示第1个图有n个结点 第三行起,每行输入邻接矩阵的一行,以此类推输入n行 第i个结点与其他结点如果相连则为1,无连接则 ...

  7. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  8. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  9. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

随机推荐

  1. Docker 创建php 开发环境遇到的权限问题解决方案

    最近我将公司的开发,和测试环境都运行到docker 上面,因为开发,测试基本都是装代码拉到本址,然后,再装目录,挂载到镜像目录中如:我用的是docker-compose # development.y ...

  2. 基于黑名单的xss过滤器

    /** * 类名称:AntiXssFilter * @version * 类描述:基于黑名单的xss过滤器 * @version * 创建人:xxx * @version * 创建时间:2015年11 ...

  3. thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)

    关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 ...

  4. 日常工作bug总结

    1.在使用jQuery的text()与val()使用时,如果按钮是<button></button>的形式使用text()写入时,在IE8下会出现延迟,即我在写定时器5秒倒计时 ...

  5. EXT 下拉框事件

    1. <ext:ComboBox ID="cbline" FieldLabel="平台部门来源" runat="server" Dis ...

  6. SpringMVC 框架的搭建及基本功能的实现

    首先新建一个WEB项目 导入jar包 我们基于Spring mvc框架进行开发,需要依赖一下的spring jar包: spring-aop-4.0.4.RELEASE.jar spring-bean ...

  7. js判断只能输入数字和只能输入

    JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...

  8. 如何让PowerShell显示中文不乱码

    故障描述: 这两天有个部门做了个Survey用来调查一些信息,由于对最后的结果报表有些特殊要求,不得不决定弃用SharePoint Survey自带的Export to spreadsheet功能,改 ...

  9. UI控件(UIWebView)

    本文主要记录UIWebView三方面内容: 1.基本的加载网页链接或文件: 2.网页js调用原生,也就是Cordova混合架构的原理: 3.原生调用js程序: 原生部分主要代码: @implement ...

  10. cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...