题目描述
给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始
注意:图n个顶点编号从0到n-1
代码框架如下:
输入
第一行输入t,表示有t个测试实例
第二行输入n,表示第1个图有n个结点
第三行起,每行输入邻接矩阵的一行,以此类推输入n行
第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开
以此类推输入下一个示例
输出
每行输出一个图的广度优先搜索结果,结点编号之间用空格隔开
输入样例1
2
4
0 0 1 1
0 0 1 1
1 1 0 1
1 1 1 0
5
0 0 0 1 1
0 0 1 0 0
0 1 0 1 1
1 0 1 0 0
1 0 1 0 0
输出样例1
0 2 3 1
0 3 4 2 1
代码1
//给出邻接矩阵,输出广度优先遍历的结果
#include<iostream>
#include<queue>
using namespace std;
#define MAX 100
class Map {
private:
void BFS(int v);
int vexnum;
int Mat[MAX][MAX];
int visited[MAX];
int adjVex[MAX];
public:
Map(int n) {
vexnum = n;
//输入邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> Mat[i][j];
}
}
//初始化访问数组
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
}
void BFSTraverse();
};
void Map::BFSTraverse() {//公有接口
BFS(0);//私有参数
}
void Map::BFS(int v) {
queue<int> Q;
visited[v] = 1;
Q.push(v);
int temp,index=0;
while (!Q.empty()) {
temp=Q.front();
cout << temp << " ";
Q.pop();
index = 0;
for (int i = 0; i < vexnum; i++) {
adjVex[i] = -1;
}
for (int i = 0; i < vexnum; i++) {
if (Mat[temp][i] == 1) {
adjVex[index++] = i;//相邻顶点
}
}
//入队
for (int i = 0; i < index; i++) {
if (visited[ adjVex[i] ] == 0) {
Q.push(adjVex[i]);
visited[adjVex[i]] = 1;//已经访问过
}
}
}
cout << endl;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
Map myMay(n);
myMay.BFSTraverse();
}
}
代码2
#include<iostream>
#include<queue>
using namespace std;
#define Maxlen 100
class Map {
bool Visited[Maxlen];//访问数组
int Matrix[Maxlen][Maxlen];
int Vexnum=0;
void BFS(int v) {
int w, u;
int i,k;
int* AdjVex = new int[Maxlen];//其他顶点编号
queue<int>Q;
Q.push(v);
//初始化
for (i = 0; i < Vexnum; i++)
Visited[i] = false;
while (!Q.empty()) {
u = Q.front();
Q.pop();
Visited[u] = 1;
cout << u << ' ';
for (i = 0; i < Maxlen; i++)
AdjVex[i] = -1;
int node = 0;
for (k = 0; k < Vexnum; k++) {
if (Matrix[u][k] == 1)
AdjVex[node++] = k;//相邻结点
}
i = 0;
for (w = AdjVex[i]; w >= 0; w = AdjVex[i++]) {
if (Visited[w] == false) {
Visited[w] = true;
Q.push(w);
}
}
};
cout << endl;
}
public:
Map() {
}
void BFSTraverse() {
BFS(0);
}
void inputMatrix(int vnum, int m[Maxlen][Maxlen]) {
int i, j;
Vexnum = vnum;
for (i = 0; i < Maxlen; i++) {
for (j = 0; j < Maxlen; j++)
Matrix[i][j] = 0;
}
for (i = 0; i < Vexnum; i++) {
for (j = 0; j < Vexnum; j++)
Matrix[i][j] = m[i][j];
}
}
};
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int matrix[Maxlen][Maxlen];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> matrix[i][j];
Map map;
map.inputMatrix(n, matrix);
map.BFSTraverse();
}
}