读书人

【算法导论】22.7 无向图的广度优先搜

发布时间: 2012-11-22 00:16:41 作者: rapoo

【算法导论】22.7 无向图的广度优先搜索--C++实现

这是用无向图的广度优先搜索代码,如果是有向图需要稍微修改,否则产生死循环。

邻接矩阵表示的无向图的广度优先搜索:

#include <iostream>#include <vector>#include <queue>using namespace std;#define  N 6#define INFINITE 0x7fffffff#define WHITE 1#define GRAY 2#define BLACK 3//顶点结点结构  struct Vertex  {  Vertex * next;/*指向下一个顶点*/int id;/*节点的标志*/    int color;//颜色      Vertex *p;//指向遍历结果的父结点      int d;//与源点之间的距离      Vertex():next(NULL),id(0),color(WHITE),p(NULL),d(INFINITE){}  };  //图结构struct Graph{Vertex *Adj[N+1];//N个顶点Graph(){         for(int i = 1; i <= N; i++)              Adj[i] = new Vertex;  }~Graph()      {          for(int i = 1; i <= N; i++)              delete Adj[i];      }  };std::queue<int>Q;/*队列,保存搜索过程的中间数据*/void Print(Graph *g);bool Init(Graph *g);bool InsertEdge(Graph *g , int start,int end);void PaintColor(Graph *g,int vertex,int color);//插入边bool InsertEdge(Graph *g , int start,int end){Vertex* v = new Vertex();v->id = end;if(g->Adj[start]->next == NULL){/*如果不存在临界表的头结点列表中,则插入*/Vertex* s = new Vertex();s->id = start;g->Adj[start] = s;}Vertex* tmp = g->Adj[start];while(tmp->next){tmp = tmp->next;}tmp->next =v;return true;}/*初始化邻接表表示的图,无向图。1->2->42->1->4->53->6->54->1->2->55->2->3->46->6->3*/bool Init(Graph *g){InsertEdge(g,1,2);InsertEdge(g,2,1);InsertEdge(g,1,4);InsertEdge(g,4,1);InsertEdge(g,2,5);InsertEdge(g,5,2);InsertEdge(g,3,5);InsertEdge(g,5,3);InsertEdge(g,3,6);InsertEdge(g,6,3);InsertEdge(g,4,2);InsertEdge(g,2,4);InsertEdge(g,5,4);InsertEdge(g,4,5);InsertEdge(g,6,6);return true;}/*宽度优先搜索,vertex为初试的节点这种方法适合于无向图,如果是有向图会产生死循环*/bool BreadFirstSearch(Graph *g,int vertex){ //对所有结点进行初始化        for(int i = 1; i <= N; i++)        {            g->Adj[i]->color = WHITE;            g->Adj[i]->d = INFINITE;            g->Adj[i]->p = NULL;        } PaintColor(g,vertex,GRAY);    g->Adj[vertex]->d = 0;      g->Adj[vertex]->p = NULL;      while(!Q.empty())      {          Q.pop();    }  Q.push(vertex);    while(!Q.empty())      {  /*应该存储节点的ID,不应该是数据结构,可以节省存储空间*/        int node = Q.front();Vertex *v = g->Adj[node]; //Q.front();          Q.pop();          std::cout<<v->id<<"\t";  while(v){if(v->color == WHITE){PaintColor(g,v->id,GRAY);g->Adj[v->id]->d = g->Adj[node]->d +1;Q.push(v->id);}v = v->next;}PaintColor(g,node,BLACK);    }      return true;  }/*对临界表的节点染色*/void PaintColor(Graph *g,int vertex,int color){g->Adj[vertex]->color = color;for(int i=1;i<=N;i++){Vertex *v = g->Adj[i];v = v->next;while(v){if(v->id == vertex){v->color = color;}v = v->next;}}}int main(){//构造一个空的图Graph *g = new Graph;Init(g);BreadFirstSearch(g,1);getchar();return 0;}


读书人网 >C++

热点推荐