A. DS图遍历--广度优先搜索

题目描述

给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点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();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值