广度优先搜索(算法导论第22章-基本的图算法)

来源:互联网 发布:手机淘宝客服怎么设置 编辑:程序博客网 时间:2024/05/17 23:04

广度优先搜索(BFS):

广度优先搜索是最简单的图搜索算法之一,也是许多重要的图算法的原型。Prim的最小生成树算法和Dijkstra的单元最短路径算法都使用了类似广度优先搜索的思想。

假定输入图G=(V,E)是以邻接链表所表示的,该算法使用一个先进先出的队列Q来管理灰色结点集。

同时广度优先搜索是一种在无权图(权值为1)上执行的最短路径算法。

BFS(G,s)  for each vertex u∈G.V-{s}      u.color=WHITE      u.d=∞      u.π=NIL  s.color=GRAY  s.d=0  s.π=NIL  Q=∅  ENQUEUE(Q,s)  while Q≠∅    u=DEQUEUE(Q)    for each v∈G.Adj[u]        if v.color==WHITE            v.color=GRAY            v.d=u.d+1            v.π=u            ENQUEUE(Q,v)    u.color=BLACK
深度优先搜索(DFS):

深度优先搜索的策略就是:只要可能,就在图中尽量“深入”。深度优先搜索总是对最近才发现的结点v的出发边进行搜索,直到该结点的所有出发边都被发现为止。一旦结点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点(v是经过该结点才被发现的),来搜索该前驱结点的出发边。一直重复直到源结点,如还有未发现的结点。则从未发现的节点中选一个作为源结点,重复上面的过程,直到所有结点都被发现。

深度优先搜索的前驱子图形成一个由多棵深度优先树构成的深度优先森林。

DFS(G)  for each vertex u∈G.V      u.color=WHITE      u.π=NIL  time=0  for each vertex u∈G.V      if u.color==WHITE           DFS-VISIT(G,u)DFS-VISIT(G,u)  time=time=1  u.d=time  u.color=GRAY  for each v∈G:Adj[u]       if v.color==WHITE            v.π=u            DFS-VISIT(G,v)  u.color=BLACK  time=time+1  u.f=time

图的存储结构—数组表示法

 #include<iostream>  using namespace std;    #define INFINTY_INT_MAX  0x7fffffff    //代表正无穷  #define MAX_VERTIEX_NUM 20    //最大顶点个数  #define MAX_INFO 20    typedef enum{DG,DN,AG,AN}GraphKind;//有向图、有向网、无向图、无向网    typedef struct  {      int adj;//顶点关系类型      char *info;//该弧的相关信息  }ArcCell,AdjMatrix[MAX_VERTIEX_NUM][MAX_VERTIEX_NUM];      typedef struct   {      char vexs[MAX_VERTIEX_NUM];//顶点向量      AdjMatrix arcs;//邻接矩阵      int vexnum,arcnum;//顶点数、弧数      GraphKind kind;//种类  }MGraph,*pMGraph; int LocateVex(MGraph G,char u)  {      int i = 0;      for(i = 0; i < G.vexnum;i++)      {          if(u == G.vexs[i])          {              return i;          }      }      return -1;  }    bool CreateDG(MGraph &G)  {      int incInfo = 0;      int i,j,k,l;      char va,vb;      char *info;      char s[MAX_INFO] = {0};//存放弧信息      cout<<"请输入有向图G的顶点数,弧数,弧是否含其它信息(是:1,否:0)"<<endl;      cin>>G.vexnum;      cin>>G.arcnum;      cin>>incInfo;      cout<<"请输入顶点值"<<endl;        for(i = 0; i < G.vexnum; i++)//构造顶点向量      {          cin>>G.vexs[i];      }            for(i = 0; i < G.vexnum; i++)//初始化邻接矩阵      {          for(j = 0 ;j < G.vexnum; j++)          {              G.arcs[i][j].adj = 0;              G.arcs[i][j].info = NULL;          }      }            cout<<"请输入每条弧的弧头和弧尾"<<endl;        for(k = 0; k < G.arcnum; k++)      {          cin>>va;          cin>>vb;            i = LocateVex(G,va);          j = LocateVex(G,vb);            G.arcs[i][j].adj = 1;          if(incInfo)          {              cout<<"输入该弧的信息"<<endl;              cin>>s;              l = strlen(s);              if(l)              {                  info = (char *)malloc(sizeof(char) * (l+1));                  strcpy(info,s);                  G.arcs[i][j].info = info;              }          }      }      G.kind = DG;      return true;  }  void Display(MGraph G)  {      int i,j;      cout<<"顶点:";      for(i = 0; i < G.vexnum; i++)      {          cout<<G.vexs[i]<<" ";      }      cout<<endl;      cout<<"边"<<endl;      for(i = 0; i < G.vexnum; i++)      {          for(j = 0; j < G.vexnum; j++)          {              cout<<G.arcs[i][j].adj<<" ";          }          cout<<endl;      }  }  int main()  {      MGraph G;      CreateDG(G);      Display(G);      return 0;  }  


0 0
原创粉丝点击