辅助队列的实现:

#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_H





enum 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 vertex
	G->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 edge
	for ( 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 vertex
	G->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 edge
	for ( 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;
	}
}


 

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐