图的结构
算法实现
#include <iostream>
using namespace std;
#define MaxSize 15
typedef int VertexType;
typedef int EdgeType;
#define vNums 7
#define eNums 7
bool visited[vNums];
struct MGraph {
VertexType vex[vNums];
EdgeType edge[vNums][vNums];
int vexNum, edgeNum;
MGraph(const VertexType *vs, const EdgeType (*es)[vNums]) : vexNum(vNums), edgeNum(eNums) {
for (int i = 0; i < vNums; i++) {
vex[i] = vs[i];
}
for (int j = 0; j < vNums; j++) {
for (int k = 0; k < vNums; k++) {
edge[j][k] = es[j][k];
}
}
}
};
struct SqQueue {
int data[MaxSize];
int front, rear;
};
SqQueue Q;
void InitQueue(SqQueue &Q) {
Q.rear = Q.front = 0;
}
bool isEmpty(SqQueue Q) {
if (Q.front == Q.rear) return true;
else return false;
}
bool EnQueue(SqQueue &Q, int x) {
if ((Q.rear + 1) % MaxSize == Q.front) return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
bool DeQueue(SqQueue &Q, int &x) {
if (Q.rear == Q.front) return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
int FirstNeighbor(MGraph G, int u) {
for (int i = 0; i < vNums; i++) {
if (G.edge[u][i] == 1 && !visited[i]) {
return i;
}
}
return -1;
}
int NextNeighbor(MGraph G, int u, int w) {
if (w == vNums - 1) {
return -1;
}
for (int i = w + 1; i < vNums; i++) {
if (G.edge[u][i] == 1 && !visited[i]) {
return i;
}
}
return -1;
}
void BFS(MGraph G) {
while (!isEmpty(Q)) {
int u;
DeQueue(Q, u);
if (!visited[u]) {
cout << u << " ";
visited[u] = true;
}
for (int w = FirstNeighbor(G, u); w >= 0; w = NextNeighbor(G, u, w)) {
if (!visited[w]) {
cout << w << " ";
visited[w] = true;
EnQueue(Q, w);
}
}
}
}
void BFSTravel(MGraph G) {
int v;
for (v = 0; v < G.vexNum; ++v) {
visited[v] = false;
}
InitQueue(Q);
EnQueue(Q, G.vex[v]);
for (v = 0; v < G.vexNum; ++v) {
if (!visited[v]) {
BFS(G);
}
}
}
int main() {
VertexType vex[vNums] = {0, 1, 2, 3, 4, 5, 6};
EdgeType edge[vNums][vNums] = {
{0, 1, 1, 0, 0, 1, 1},
{1, 0, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 1, 1, 0},
{0, 0, 0, 1, 0, 1, 1},
{1, 0, 0, 1, 1, 0, 0},
{1, 0, 0, 0, 1, 0, 0}
};
MGraph G(vex, edge);
BFSTravel(G);
return 0;
}
运行结果