把以前写过的图的广度优先搜索分享给大家(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. HTML5 与 CSS3 jQuery部分知识总结【转】

    一.    HTML5 为什么需要HTML5 什么是HTML5 HTML5现状及浏览器支持 HTML5优点与缺点 HTML5语法规则与文档声明 HTML5新增表达标签 HTML5多媒体组件 HTML5 ...

  2. C# winfrom 窗体的StartPosition 属性

    StartPosition属性有如下选项,分别含义如下: CenterParent 窗体在其父窗体中居中. CenterScreen 窗体在当前显示窗口中居中,其尺寸在窗体大小中指定. Manual ...

  3. 利用ajax的方式来提交数据到后台数据库及交互功能

    怎么样用ajax来提交数据到后台数据库,并完成交互呢????? 一.当我们在验证表单的时候,为了阻止把错误的也发送到服务器,我们通常这样设置:     $(function(){       var ...

  4. 程序后端调用post请求。

    /// <summary> /// 调用Web API /// </summary> public class InvokeMVCWebAPI { /// <summar ...

  5. 【Beta】Daily Scrum Meeting总结

    团队博客目录:FTD团队博客目录 一.项目预期计划和现实进展 更换网络请求框架为okHttp 完成 补充和完善服务器的API 完成(可与web端互连) 补充和完善app与服务器交互的类和方法 完成 完 ...

  6. NGINX实现反向代理

    一.安装NGINX 略,请自行百度,GOOGEL 二.配置文件1.由上面的步骤,我们看到配置文件放置在/etc/nginx/目录下:主要配置文件:/etc/nginx/nginx.conf 扩展配置文 ...

  7. VB.Net 2010中 ./和../的含义

    文件路径 文件路径就是文件在电脑(服务器)中的位置,表示文件路径的方式有两种:相对路径和绝对路径. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作 ...

  8. Android四大组件--事务详解(转)

    一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换成另一种状态.   事务必须服从ISO/IEC所制定的ACID原则. ...

  9. poj1200-Crazy Search(hash入门经典)

    Hash:一般是一个整数.就是说通过某种算法,可以把一个字符串"压缩" 成一个整数.一,题意: 给出两个数n,nc,并给出一个由nc种字符组成的字符串.求这个字符串中长度为n的不同 ...

  10. 8天掌握EF的Code First开发系列之动手写第一个Code First应用

    返回<8天掌握EF的Code First开发>总目录 本篇目录 创建控制台项目 根据.Net中的类来创建数据库 简单的CRUD操作 数据库模式更改介绍 本章小结 自我测试 上一篇<8 ...