图的广度优先遍历::邻接矩阵+队列.
来源:互联网 发布:vb编写加减乘除计算器 编辑:程序博客网 时间:2024/06/10 01:19
之前用队列的时候,实现方式很简陋:一维数组+两个指针。现在先规范的写出队列的所有函数的算法,然后放到一个头文件中,直接调用函数。一开始很不习惯,主要是以前编程都是等到要什么功能的函数就地编写。后来看到C++中一些关于代码重用的说法,再想想自己确实写了很多功能相似的函数也即做了很多无用功。于是狠下心来,把数据结构中存储结构的函数功能和经常使用的一些函数都实现,放到头文件中,以后直接调用。
其实广度优先的原理都是一样的(迷宫的广度,二叉树的层序……),就是用队列,然后不停的将与要出队的结点有关联的结点入队(这个有点难说明白,表达能力有待提高……),直到队空。
//图:邻接矩阵:广度优先遍历#include<iostream>#include<cstdlib>using namespace std;#include"Queue.h" // 队列const int size=9;struct ArcCell{bool Matrix[size][size]; //邻接矩阵int VexNum; //图的顶点数};struct ArcCell G;bool sign[size];void BreFirst(struct Queue &Q);int main(){ const int sidenum=14; int map[sidenum][2]={{0,1},{0,5},{1,2},{1,8}, {1,6},{2,3},{2,8},{3,4}, {3,7},{3,8},{4,5},{4,7}, {5,6},{6,7}}; for(int i=0;i<sidenum;i++) G.Matrix[map[i][0]][map[i][1]]=TRUE; for(int i=0;i<size;i++) { for(int j=0;j<size;j++) cout<<G.Matrix[i][j]<<' '; cout<<endl; } cout<<endl; for(int i=0;i<size;i++) sign[i]=FALSE; struct Queue Q; IniQueue(Q); int i=0; InQueue(Q,i); sign[i]=TRUE; for(;i<size;i++) BreFirst(Q); DestroyQueue(Q); return 0;}void BreFirst(struct Queue &Q){ if(QueueEmpty(Q)) return; int tmp; OutQueue(Q,tmp); cout<<tmp<<' '; for(int j=0;j<size;j++) if(G.Matrix[tmp][j]==TRUE &&sign[j]==FALSE) { InQueue(Q,j); sign[j]=TRUE; }}
//数据结构:队列#include<iostream>using namespace std;typedef int DataType;const int FIRSTSIZE=100;const bool TRUE=1;const bool FALSE=0;struct Queue{ DataType *data; int length; //已存数据个数int size_; //可存数据个数};void IniQueue(struct Queue &Q); //构造空队列void DestroyQueue(struct Queue &Q); //销毁队列bool InQueue(struct Queue &Q,DataType &data);bool OutQueue(struct Queue &Q,DataType &data);bool QueueEmpty(struct Queue &Q);void IniQueue(struct Queue &Q){ Q.data=new DataType [FIRSTSIZE]; Q.length=0; Q.size_=FIRSTSIZE;}void DestroyQueue(struct Queue &Q){ if(!Q.data) return; delete [] Q.data; Q.data=NULL; Q.length=0; Q.size_=0;}bool InQueue(struct Queue &Q,DataType &data){ if(Q.length==FIRSTSIZE) return FALSE; Q.data[Q.length]=data; ++Q.length; return TRUE;}bool OutQueue(struct Queue &Q,DataType &data){ if(Q.length==0) return FALSE; data=Q.data[0]; --Q.length; for(int i=0;i<Q.length;i++) Q.data[i]=Q.data[i+1]; return TRUE;}bool QueueEmpty(struct Queue &Q){ if(Q.length==0) return TRUE; else return FALSE;}
0 0
- 图的广度优先遍历::邻接矩阵+队列.
- 图的广度优先遍历(邻接矩阵)
- 图的广度优先遍历邻接矩阵
- 基于邻接矩阵图的广度优先遍历
- 图的邻接矩阵存储下的广度优先遍历
- 基于邻接矩阵的无向图的广度优先遍历
- 【图】图的邻接矩阵存储和广度、深度优先遍历
- 图的邻接矩阵存储:深度、广度优先遍历
- 图的广度优先遍历BFS(邻接矩阵表示法)
- 图的邻接矩阵表示法及广度优先遍历
- 无向图的广度优先遍历---邻接矩阵实现
- 图的广度优先遍历BFS(邻接矩阵表示法)
- 图(邻接矩阵)的深度、广度优先遍历
- 图的广度优先搜索遍历(邻接表&邻接矩阵)(C++)
- 图(邻接矩阵存储)的广度优先遍历算法
- 基于邻接矩阵的广度优先搜索遍历
- 基于邻接矩阵的广度优先搜索遍历
- 基于邻接矩阵的广度优先搜索遍历
- DBGRIDEH的汉化(EhLib的汉化)
- 将小米盒子打造成开发环境
- 数组你的命运在何方
- Tesseract学习(一)
- Java中ArrayList和LinkedList区别
- 图的广度优先遍历::邻接矩阵+队列.
- 使用CocoaPods管理依赖库
- php json与数组转换及中文乱码问题
- linux内核学习笔记------邻居子系统(一)
- matlab interp使用 记录
- 数据库优化实践【信息跟踪篇】
- 说说JSON和JSONP
- 过去的2013,展望的2014
- Matlab中插值函数汇总和使用说明