非加权图的单源最短路径问题(解法:BFS)以及BFS、DFS的简单实现

1、非加权图的单源最短路径问题(解法:BFS)

此问题可以利用Dijkstra算法求解时,只需要把所有边的权值看成1即可,但复杂度高。此处利用BFS加以求解。以下给定几个参数方便存储信息。

非加权单源最短路径解法:BFS
    start:    有向图中的计算的起始结点
    dist:    存储结点到源结点的距离的数组,初始值为无穷大,虽然每条边权值都相等,但源结点到所求结点经过几条边就代表权值总各
    preNode:存储每个结点的前驱结点的数组,从而利用print函数可以显示所走的结点信息
    flag:    表明结点是否已经遍历过的布尔数组

#include<iostream>
#include<vector>
#include<queue>

/*
	非加权单源最短路径解法:BFS
	start:	有向图中的计算的起始结点
	dist:	存储结点到源结点的距离的数组,初始值为无穷大,虽然每条边权值都相等,
但源结点到所求结点经过几条边就代表权值总各
	preNode:存储每个结点的前驱结点的数组,从而利用print函数可以显示所走的结点信息
	flag:	表明是否有已经遍历过结点的布尔数组
*/

void bfsForUnweightedShortDistance(vector<vector<int>>& nums, int start
, vector<bool>& flag, vector<int>& dist, vector<int>& preNode) {
	queue<int> q;
	//初始源结点
	q.push(start);
	preNode[start] = start;
	dist[start] = 0;
	while (!q.empty()) {
		int top = q.front();
		if (!flag[top]) {
			flag[top] = true;
			for (int i = 0; i < nums[top].size(); i++) {
				if (dist[top] + 1 < dist[nums[top][i]]) {//当所达下一结点距离比之前要小时才更新下一结点信息
					q.push(nums[top][i]);
					dist[nums[top][i]] = dist[top] + 1;
					preNode[nums[top][i]] = top;
				}
			}
		}
		q.pop();
	}
}

void print(int start, int end, vector<int>& dist, vector<int>& preNode) {
	if (end == start) {
		cout << start << ","<<dist[start] << endl;
		return;
	}
	if (end != start) {
		print(start, preNode[end], dist, preNode);
		cout << end << "," << dist[end] << endl;
	}
}

int main() {
	vector<vector<int>> nums = { {1,3},{3,4},{0,5},{2,4,5,6},{6},{},{5} };
	vector<bool> flag(nums.size(), false);
	vector<int> dist(nums.size(), INT_MAX), preNode(nums.size(), 0);
	bfsForUnweightedShortDistance(nums, 2, flag, dist, preNode);
	print(2,4, dist, preNode);
	
	return 0;
}

2、遍历图的结点——BFS简单实现

#include<iostream>
#include<vector>

using namespace std;

void bfs(vector<vector<int>>& nums, int start, vector<bool>& flag, vector<int>& res) {
	queue<int> q;
	q.push(start);
	while (!q.empty()) {
		int top = q.front();
		if (!flag[top]) {
			flag[top] = true;
			res.push_back(top);
			for (int i = 0; i < nums[top].size(); i++) {
				q.push(nums[top][i]);
			}
		}
		q.pop();
	}

}

int main() {
	vector<vector<int>> nums = { { 1 },{ 2,3 },{ 0 },{ 0,2 },{ 5,6 },{ 1 },{ 3,5 } };
	vector<bool> flag(nums.size(), false);
	vector<int> res;
	bfs(nums, 4, flag, res);
	for (int i = 0; i < res.size(); ++i) {
		if (i != res.size()) {
			cout << res[i] + 1 << endl;
		}
		else
			cout << res[i] + 1;
	}
}

3、遍历图的结点——DFS简单实现

#include<iostream>
#include<vector>

using namespace std;

void dfs(vector<vector<int>>& nums, int start, vector<bool>& flag, vector<int>& res) {
	if (!flag[start]) {
		res.push_back(start);
		flag[start] = true;
	}

	for (int i = 0; i < nums[start].size(); ++i) {
		if (!flag[nums[start][i]]) {
			res.push_back(nums[start][i]);
			flag[nums[start][i]] = true;
			dfs(nums, nums[start][i], flag, res);
		}
	}
}

int main() {
	vector<vector<int>> nums = { { 1 },{ 2,3 },{ 0 },{ 0,2 },{ 5,6 },{ 1 },{ 3,5 } };
	vector<bool> flag(nums.size(), false);
	vector<int> res;
	dfs(nums, 4, flag, res);
	for (int i = 0; i < res.size(); ++i) {
		if (i != res.size()) {
			cout << res[i] + 1 << endl;
		}
		else
			cout << res[i] + 1;
	}
}

猜你喜欢

转载自blog.csdn.net/TT_love9527/article/details/81663367