图的广度优先遍历::邻接矩阵+队列.

来源:互联网 发布: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