图的广度优先遍历现实

来源:互联网 发布:淘宝哪家派力肯 编辑:程序博客网 时间:2024/05/21 19:39

算法原理参见《算法导论》

//MatrixGraph.h#pragma once#include <vector>struct MatrixGraph{enum{MAXVEX=100};static const int INFINITY;char vexs[MAXVEX]; //顶点类型 charint arc[MAXVEX][MAXVEX]; //邻接矩阵int numVerteices; //图中当前的顶点数int numEdges; //图中当前的边数MatrixGraph();};void MBFSTraverse(MatrixGraph & mGraph, int v);//edgeIdPairs <i, j> //i, j为顶点编号 struct Edge{int i;int j;int weight;};void CreateMatrixGraph(MatrixGraph & mGraph, std::vector<char> & vertexName, std::vector<Edge> & edges);//void MDFSTraverse(MatrixGraph & mGraph, int v);


 

//MatrixGraph.cpp#include "MatrixGraph.h"#include <iostream>#include <memory.h>#include <queue>const int MatrixGraph::INFINITY = INT_MAX;bool visited[MatrixGraph::MAXVEX];MatrixGraph::MatrixGraph():numVerteices(0), numEdges(0){//tempmemset(vexs, 0, sizeof(char)*MAXVEX);for(int i=0; i<MAXVEX; i++){for(int j=0; j<MAXVEX; j++){arc[i][j] = INFINITY;}}for(int i=0; i<MAXVEX; i++){arc[i][i] = 0;}}void CreateMatrixGraph(MatrixGraph & mGraph, std::vector<char> & vertexName, std::vector<Edge> & edges){int count = vertexName.size();mGraph.numVerteices = count;//生成顶点for(int i=0; i<count; i++){mGraph.vexs[i] = vertexName[i]; //i为顶点的编号}//生成边count = edges.size(); //一定是偶数for(int k=0;k<count; k++){mGraph.arc[edges[k].i][edges[k].j] = mGraph.arc[edges[k].j][edges[k].i] = edges[k].weight; //无向图}}//返回v节点的第一个邻接顶点。若顶点v在图中没有邻接顶点,则返回-1int FirstAdjVex(MatrixGraph & mGraph, int v){for(int j=0; j<mGraph.numVerteices; j++){//图的边有权重 不相连的边的权重为INFINITY 权重为非负整数if(mGraph.arc[v][j] != MatrixGraph::INFINITY && mGraph.arc[v][j] != 0 && !visited[j])//if(mGraph.arc[v][j] != MatrixGraph::INFINITY && mGraph.arc[v][j] != 0)return j;}return -1;}//返回v的(相对于w的)下一个邻接顶点。若访问完了v的所有顶点,则返回-1int NextAdjVex(MatrixGraph & mGraph, int v, int w){for(int j=w; j<mGraph.numVerteices; j++){//图的边有权重 不相连的边的权重为INFINITY 权重为非负整数if(mGraph.arc[v][j] != MatrixGraph::INFINITY&& !visited[j]) //if(mGraph.arc[v][j] != MatrixGraph::INFINITY) {return j;}}return -1;}struct MVertex{enum Color{Color_White,Color_Gray,Color_Black};int index;Color color;int d; //distanceMVertex(){}MVertex(int _index, Color _color):index(_index), color(_color){}};//算法导论 22.2 Breadth-first searchvoid MBFSTraverse(MatrixGraph & mGraph, int startV){memset(visited, 0, sizeof(bool)*MatrixGraph::MAXVEX);//置空的辅助队列Qstd::vector<MVertex> verticeHelper;for(int i=0; i<mGraph.numVerteices; i++){verticeHelper.push_back(MVertex(i, MVertex::Color_White));}std::queue<MVertex> queueHelper;verticeHelper[startV].d = 0;queueHelper.push(verticeHelper[startV]);MVertex u;while(!queueHelper.empty()){u = queueHelper.front();visited[u.index] = true;queueHelper.pop();for(int v = FirstAdjVex(mGraph, u.index); v>-1; v=NextAdjVex(mGraph, u.index, v)){if(verticeHelper[v].color == MVertex::Color_White){visited[v]=true;verticeHelper[v].d = u.d + 1;verticeHelper[v].color = MVertex::Color_Gray;queueHelper.push(verticeHelper[v]);printf("%c%(%i),",mGraph.vexs[v],verticeHelper[v].d); //std::cout<<mGraph.vexs[v]<"()";}}verticeHelper[u.index].color = MVertex::Color_Black;}}

 

//TestMGraph.cpp#include "MatrixGraph.h"#define DefA 0#define DefB 1#define DefC 2#define DefD 3#define DefE 4#define DefF 5#define DefG 6#define DefH 7#define DefI 8void CreateGraph1(MatrixGraph & mGraph){std::vector<char> vertexName;char arr[]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'};vertexName.insert(vertexName.begin(), arr, arr+9);std::vector<Edge> edges;Edge e;//1e.weight = 1;e.i = DefA;e.j=DefB;edges.push_back(e);//2e.i = DefF;e.j=DefE;edges.push_back(e);//3e.i = DefC;e.j=DefD;edges.push_back(e);//4e.i = DefI;e.j=DefD;edges.push_back(e);//5e.i = DefA;e.j=DefF;edges.push_back(e);//6e.i = DefB;e.j=DefG;edges.push_back(e);//7e.i = DefB;e.j=DefC;edges.push_back(e);//8e.i = DefD;e.j=DefE;edges.push_back(e);//9e.i = DefG;e.j=DefD;edges.push_back(e);//10e.i = DefG;e.j=DefF;edges.push_back(e);//11e.i = DefB;e.j=DefI;edges.push_back(e);//12e.i = DefG;e.j=DefH;edges.push_back(e);//13e.i = DefH;e.j=DefD;edges.push_back(e);//14e.i = DefH;e.j=DefE;edges.push_back(e);//e.i = DefC;e.j=DefI;edges.push_back(e);CreateMatrixGraph(mGraph, vertexName, edges);}void TestMGraph(){MatrixGraph mGraph;CreateGraph1(mGraph);//MDFSTraverse(mGraph, 0);MBFSTraverse(mGraph, 0);}

 结果

B(1),F(1),C(2),G(2),I(2),E(2),D(3),H(3),请按任意键继续. . .



 

原创粉丝点击