图的遍历(BFS, DFS)源代码

来源:互联网 发布:mac能打开mpq文件吗 编辑:程序博客网 时间:2024/04/28 19:19

辅助队列的实现:

#ifndef QUEUE_H#define QUEUE_H#include "Graph.h"typedef struct{int *data;int head;int tail;int length;  // 现在数据长度int size;     //  总的可存储大小}Queue;void CreateQueue( Queue *Q, int s );void EnQueue( Queue *Q, int x );int DeQueue( Queue *Q );#endif


 

#include "Queue.h"#include <iostream>using namespace std;void CreateQueue( Queue *Q, int s ){Q->size = s;Q->length = 0;Q->head = 0;Q->tail = 0;Q->data = new int[s];}void EnQueue( Queue *Q, int x ){if ( ( Q->tail + 1 ) % Q->size == Q->head ){cout << "Overflow!" << endl;return;}Q->data[Q->tail] = x;Q->length++;Q->tail = ( Q->tail + 1 ) % Q->size;}int DeQueue( Queue *Q ){if ( Q->tail == Q->head ){cout << "Underflow!" << endl;return -1;}int tmp = Q->data[Q->head];Q->head = ( Q->head + 1 + Q->size ) % Q->size;Q->length--;return tmp;}


 

图的遍历头文件

/** * @brief Graph  * @author An * @data  2013.9.3                                                                  **/#ifndef GRAPH_H#define GRAPH_Henum Colour { WHITE, GRAY, BLACK };// 邻接表的节点struct EdgeNode{int No;EdgeNode *nextEdge;};// 邻接表头结点typedef struct VertexNode  {int No;EdgeNode *firstEdge;Colour clr;int dist;VertexNode *parent;int start;int finish;}*AdjList;// 图typedef struct {int vertexNum, edgeNum;AdjList *adjlist;}ALGraph;void CreateUDGraph( ALGraph *G, int vn, int en, int *v, int **e );void CreateDGraph( ALGraph *G, int vn, int en, int *v, int **e );void BFS( ALGraph *G, int index );void PrintPath( ALGraph *G, int s, int v );void DFSVisit( ALGraph *G, int index, int &time );void DFS( ALGraph *G );void PrintDFS( ALGraph *G );#endif


 

源文件

/** * @brief Graph  * @author An * @data  2013.9.3                                                                  **/#include "Graph.h"#include "Queue.h"#include <limits>#include <iostream>using namespace std;void CreateUDGraph( ALGraph *G, int vn, int en, int *v, int **e ){G->vertexNum = vn;G->edgeNum = en;// initialize the vertexG->adjlist = new VertexNode*[G->vertexNum];for ( int i = 0; i < G->vertexNum; ++i ){G->adjlist[i] = new VertexNode[G->edgeNum];}for ( int i = 0; i < G->vertexNum; ++i ){G->adjlist[i]->No = v[i];G->adjlist[i]->firstEdge = NULL;}// initialize the edgefor ( int j = 0; j < G->edgeNum; ++j ){EdgeNode *node1 = new EdgeNode;EdgeNode *node2 = new EdgeNode;node1->No = e[j][1];node1->nextEdge = G->adjlist[e[j][0]]->firstEdge;G->adjlist[e[j][0]]->firstEdge = node1;node2->No = e[j][0];node2->nextEdge = G->adjlist[e[j][1]]->firstEdge;G->adjlist[e[j][1]]->firstEdge = node2;}}void CreateDGraph( ALGraph *G, int vn, int en, int *v, int **e ){G->vertexNum = vn;G->edgeNum = en;// initialize the vertexG->adjlist = new VertexNode*[G->vertexNum];for ( int i = 0; i < G->vertexNum; ++i ){G->adjlist[i] = new VertexNode[G->edgeNum];}for ( int i = 0; i < G->vertexNum; ++i ){G->adjlist[i]->No = v[i];G->adjlist[i]->firstEdge = NULL;}// initialize the edgefor ( int j = 0; j < G->edgeNum; ++j ){EdgeNode *node1 = new EdgeNode;node1->No = e[j][1];node1->nextEdge = G->adjlist[e[j][0]]->firstEdge;G->adjlist[e[j][0]]->firstEdge = node1;}}void BFS( ALGraph *G, int start ){for ( int i = 0; i < G->vertexNum; ++i ){if ( i != start ){G->adjlist[i]->clr = WHITE;G->adjlist[i]->dist = INT_MAX;G->adjlist[i]->parent = NULL;}}G->adjlist[start]->clr = GRAY;G->adjlist[start]->dist = 0;G->adjlist[start]->parent = NULL;Queue *Q = new Queue;CreateQueue( Q, G->vertexNum );for ( int i = -1; i < G->vertexNum; ++i ) // 考虑非连通情况{if ( G->adjlist[start]->clr == GRAY ){EnQueue( Q, start );}else if ( G->adjlist[i]->clr == WHITE ){G->adjlist[i]->clr = GRAY;EnQueue( Q, i );}while ( Q->length != 0 ){int u = DeQueue( Q );for ( EdgeNode *e = G->adjlist[u]->firstEdge; e != NULL; e = e->nextEdge ){if ( G->adjlist[e->No]->clr == WHITE ){G->adjlist[e->No]->clr = GRAY;G->adjlist[e->No]->dist = G->adjlist[u]->dist + 1;G->adjlist[e->No]->parent = G->adjlist[u];EnQueue( Q, e->No );}}G->adjlist[u]->clr = BLACK;}}}void PrintPath( ALGraph *G, int s, int v ){if ( v == s ){cout << s;}else if ( G->adjlist[v]->parent == NULL ){cout << "no path from " << s << " to " << v << " exists." << endl;}else{PrintPath( G, s, G->adjlist[v]->parent->No );cout << " " << v;}}void DFSVisit( ALGraph *G, int index, int &time ){cout << index << " ";G->adjlist[index]->clr = GRAY;time++;G->adjlist[index]->start = time;for ( EdgeNode *e = G->adjlist[index]->firstEdge; e != NULL; e = e->nextEdge ){if ( G->adjlist[e->No]->clr == WHITE ){G->adjlist[e->No]->parent == G->adjlist[index];DFSVisit( G, e->No, time );}}G->adjlist[index]->clr = BLACK;time++;G->adjlist[index]->finish = time;}void DFS( ALGraph *G ){for ( int i = 0; i < G->vertexNum; ++i ){G->adjlist[i]->clr = WHITE;G->adjlist[i]->parent = NULL;}int time = 0;for ( int i = 0; i < G->vertexNum; ++i ){if ( G->adjlist[i]->clr == WHITE ){DFSVisit( G, i, time );}}}void PrintDFS( ALGraph *G ){for ( int i = 0; i < G->vertexNum; ++i ){cout << i << " : " << G->adjlist[i]->start << ", " << G->adjlist[i]->finish << endl;}}


 

 

原创粉丝点击