广度优先搜索_基于邻接矩阵

来源:互联网 发布:python实现支付宝 编辑:程序博客网 时间:2024/06/05 00:24
//广度优先搜索算法//procedure BFS(G:带顶点v1,...vn的连通图)//T:=只包含顶点v1的树//L:=空表//把v1放入尚未处理顶点的表L中//------------------------------------////while L非空//begin//  删除L中第一个顶点v//  for v的每个邻居w//    if w既不在L中也不在T中 then//     begin//加入w到表L的末尾//加入w和边{v,w}到T//   end//end#include <iostream>  using namespace std;  //012345分别表示v0 v1......    int v;//////点数目    int edge;///边数目    int j=0;  int Lleft=0,Lright=0;//队列头和尾  int** draw(int* &t);//绘图  void BFS(int **a,int head,int *T,int *L);//深度优先搜索int no_T(int num,int *T);//判断是否访问过了int no_L(int num,int *L);//判断是否在队列中int main(int argc, char const *argv[])  {    int *T;  int**a=draw(T);//指针变量的引用    int *L=new int[v*2];//队列//------------------------------------------------------------------------//  for (int i = 0; i < v; ++i)//v个访问始点{  j=0;  Lleft=0;////记得重新设置  Lright=0;//队列头和尾    BFS(a,i,T,L);  cout<<endl;}  delete []a;  delete []T;  delete []L;  return 0;  }  int** draw(int* &t)//绘图  {    int i,j;    cin>>v>>edge;///输入点数目和边数目   t=new int[v+1];   int **a=new int*[v];  for ( i = 0; i < v; ++i)      a[i]=new int[v];    for ( i = 0; i < v; ++i)      for ( j = 0; j < v; ++j)        a[i][j]=0;      int spot1,spot2;    for ( i = 0; i < edge; ++i)    {      cin>>spot1>>spot2;      a[spot1][spot2]++;    a[spot2][spot1]++;    }  ///-------------------------------------------------------------///      for ( i = 0; i < v; ++i)    {      for ( j = 0; j < v; ++j)    {      cout<<a[i][j]<<" ";       }     cout<<"\n";      }      cout<<"\n";    return a;  }  void BFS(int **a,int head,int *T,int *L){   cout<<head<<" ";//始点   T[j++]=head;////////////这两句相当于:T:=只包含顶点v1的树   L[Lright++]=head;//相当于:把v1放入尚未处理顶点的表L中   while(Lleft != Lright)   {    int chu=L[Lleft++];    for (int i = 0; i < v; ++i)    {   if(a[chu][i]!=0 && no_T(i,T) && no_L(i,L))// w既不在L中也不在T中     {     cout<<i<<" ";//加入树中     L[Lright++]=i;//入队列    T[j++]=i;//加入树表     }    }   }}int no_T(int num,int *T){   for (int i = 0; i < j; ++i)   {   if (num==T[i])   return 0;    }   return 1;}int no_L(int num,int *L){   for (int i = Lleft; i < Lright; ++i)   {   if (num==L[i])   return 0;    }   return 1;}/*570 10 20 31 41 32 33 4图0 1 1 1 01 0 0 1 11 0 0 1 01 1 1 0 10 1 0 1 0路线0 1 2 3 41 0 3 4 22 0 3 1 43 0 1 2 44 1 3 0 2Press any key to continue*/

0 0
原创粉丝点击