您的位置:首页 > 其它

邻接矩阵实现BFS广度优先搜索

2015-03-29 22:53 429 查看
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <queue>
using namespace std;

#define VERTEX_NUM 8

bool visited[VERTEX_NUM + 1];            // 访问标志数组(备忘表)

int FirstAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v)
{
for (int j = 1; j <= VERTEX_NUM; j++) {
if (G[v][j] == 1)
return j;
}
cout << "该点是孤立点" << endl;        // 连通图则不会到这一步
return -1;
}

int NextAdjVex(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1], int v, int w)
{
for (int j = w + 1; j <= VERTEX_NUM; j++) {
if (G[v][j] == 1)
return j;
}
return -1;
}

void BFSTraverse(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
// 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited。
int v;
int w;
queue<int> Q;
int u;
for (v = 1; v <= VERTEX_NUM; ++v)
visited[v] = false;
for (v = 1; v <= VERTEX_NUM; ++v) {
if (!visited[v]) {                    // v尚未访问
visited[v] = true;
cout << v << endl;
Q.push(v);
while (!Q.empty()) {
u = Q.front();
Q.pop();                    // 队头元素出队并置为u
for (w = FirstAdjVex(G, u); w >= 0; w = NextAdjVex(G, u, w)) {
if (!visited[w]) {        // u的尚未访问的邻接顶点w入队列Q
visited[w] = true;
cout << w << endl;
Q.push(w);
}
}
}
}
}
}

void CreatAdjMatrixGraph(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
int a;
int b;
while (cin >> a >> b, !(a == 0 && b == 0)) {    //以0 0作为输入结束
G[a][b] = 1;
G[b][a] = 1;
}
}

void Display(bool G[VERTEX_NUM + 1][VERTEX_NUM + 1])
{
for (int i = 1; i <= VERTEX_NUM; i++) {            // 输出邻接矩阵
for (int j = 1; j <= VERTEX_NUM; j++) {
cout << G[i][j] << ' ';
}
cout << endl;
}
}

int main(int argc, char **argv)
{
freopen("cin.txt", "r", stdin);
bool G[VERTEX_NUM + 1][VERTEX_NUM + 1] = {0};

CreatAdjMatrixGraph(G);

Display(G);

BFSTraverse(G);

return 0;
}

/* cin.txt:
2
4
5
4
5
3
6
7
7
0
*/

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: