图的广度历遍算法(待完善)

来源:互联网 发布:python gui界面实例 编辑:程序博客网 时间:2024/05/02 02:35

#include <iostream.h>
#define MAX_VERTEX 20   //最大顶点数
//====================================================
struct Vertex     //顶点结构体
{
 int number;     //顶点编号
 char info;     //顶点信息
};
struct MyGraph     //图的邻接矩阵结构体
{
 int Arcs[MAX_VERTEX][MAX_VERTEX];  //邻接矩阵的弧,数组表示
 Vertex vertex[MAX_VERTEX];    //顶点,存放顶点信息
 int vertex_num, arc_num;    //顶点、弧总数 
};
//====================================================
void BFSTraverse( MyGraph G, int v )
{
 int m,n,i;
 int visited[MAX_VERTEX];   //访问标志数组,最大为图G的顶点数
 int queue[MAX_VERTEX];    //访问队列,最大为图G的顶点数
 int front=0, rear=0;    //初始化循环队列的头和尾
 for( m=0; m<G.vertex_num; m++ )  //初始化访问数组,未访问的为0,访问过的为1
  visited[m] = -1;

 for( m=0; m<G.vertex_num; m++ )
 {
  if( visited[v]!=1 )    //若v尚未访问
  {
   cout<< v <<"  ";
   visited[v] = 1;    //访问该结点后将其置为“已访问”
   queue[rear] = v;   //入队并将队尾加1
   rear=(rear+1)%MAX_VERTEX; //模MAX_VERTEX是为了实现循环队列的功能
  }
  while( front!=rear )   //若队列不为空
  {
   front = (front+1)%MAX_VERTEX;
   n = queue[front];
   for( i=0; i<G.vertex_num; i++ )
   {
    if( visited[i]!=1 && G.Arcs[0][i]!=0 )
    {
     cout<<i<<"  ";
     visited[i] = 1;    //访问该结点后将其置为“已访问”
     queue[rear] = i;   //入队并将队尾加1
     rear=(rear+1)%MAX_VERTEX; 
    } 
    if( visited[i]!=1 && G.Arcs[i][0]!=0 )
    {
     cout<<i<<"  ";
     visited[i] = 1;    //访问该结点后将其置为“已访问”
     queue[rear] = i;   //入队并将队尾加1
     rear=(rear+1)%MAX_VERTEX; 
    }
   }
  }
 }
}
//====================================================
void main()
{
 MyGraph hao;
 int A[6][6]={   //教材P162 图7.9(b) 的有向图
  {0,5,0,7,0,0},  //共6个顶点,9条弧
  {0,0,4,0,0,0}, 
  {8,0,0,0,0,9},
  {0,0,5,0,0,6},
  {0,0,0,5,0,0},
  {3,0,0,0,1,0}};
 int i, j;
 hao.vertex_num = 6;  //设置图hao的顶点数为6个
 hao.arc_num = 9;   //设置图hao的弧数为6个

 for( i=0; i<hao.vertex_num; i++ )  //初始化图hao
  for( j=0; j<hao.arc_num; j++ )
   hao.Arcs[i][j] = A[i][j];

 BFSTraverse( hao, 0 );
 cout<<endl;
}
/*程序输出如下:  不明白为甚最后一个结点“4”访问不到!!!
 
   0  1  2  3  5
   Press any key to continue
*/

原创粉丝点击