算法原理参见《算法导论》
//MatrixGraph.h
#pragma once
#include <vector>
struct MatrixGraph
{
enum{MAXVEX=100};
static const int INFINITY;
char vexs[MAXVEX]; //顶点类型 char
int 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)
{
//temp
memset(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在图中没有邻接顶点,则返回-1
int 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的所有顶点,则返回-1
int 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; //distance
MVertex()
{
}
MVertex(int _index, Color _color)
:index(_index), color(_color)
{
}
};
//算法导论 22.2 Breadth-first search
void MBFSTraverse(MatrixGraph & mGraph, int startV)
{
memset(visited, 0, sizeof(bool)*MatrixGraph::MAXVEX);
//置空的辅助队列Q
std::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 8
void 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;
//1
e.weight = 1;
e.i = DefA;e.j=DefB;
edges.push_back(e);
//2
e.i = DefF;e.j=DefE;
edges.push_back(e);
//3
e.i = DefC;e.j=DefD;
edges.push_back(e);
//4
e.i = DefI;e.j=DefD;
edges.push_back(e);
//5
e.i = DefA;e.j=DefF;
edges.push_back(e);
//6
e.i = DefB;e.j=DefG;
edges.push_back(e);
//7
e.i = DefB;e.j=DefC;
edges.push_back(e);
//8
e.i = DefD;e.j=DefE;
edges.push_back(e);
//9
e.i = DefG;e.j=DefD;
edges.push_back(e);
//10
e.i = DefG;e.j=DefF;
edges.push_back(e);
//11
e.i = DefB;e.j=DefI;
edges.push_back(e);
//12
e.i = DefG;e.j=DefH;
edges.push_back(e);
//13
e.i = DefH;e.j=DefD;
edges.push_back(e);
//14
e.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),请按任意键继续. . .