此问题可以利用Dijkstra算法求解时,只需要把所有边的权值看成1即可,但复杂度高。此处利用BFS加以求解。以下给定几个参数方便存储信息。
非加权单源最短路径解法:BFS
start: 有向图中的计算的起始结点
dist: 存储结点到源结点的距离的数组,初始值为无穷大,虽然每条边权值都相等,但源结点到所求结点经过几条边就代表权值总各
preNode:存储每个结点的前驱结点的数组,从而利用print函数可以显示所走的结点信息
flag: 表明结点是否已经遍历过的布尔数组
#include
#include
#include
/*
非加权单源最短路径解法:BFS
start: 有向图中的计算的起始结点
dist: 存储结点到源结点的距离的数组,初始值为无穷大,虽然每条边权值都相等,
但源结点到所求结点经过几条边就代表权值总各
preNode:存储每个结点的前驱结点的数组,从而利用print函数可以显示所走的结点信息
flag: 表明是否有已经遍历过结点的布尔数组
*/
void bfsForUnweightedShortDistance(vector>& nums, int start
, vector& flag, vector& dist, vector& preNode) {
queue 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& dist, vector& preNode) {
if (end == start) {
cout << start << ","<> nums = { {1,3},{3,4},{0,5},{2,4,5,6},{6},{},{5} };
vector flag(nums.size(), false);
vector dist(nums.size(), INT_MAX), preNode(nums.size(), 0);
bfsForUnweightedShortDistance(nums, 2, flag, dist, preNode);
print(2,4, dist, preNode);
return 0;
}
#include
#include
using namespace std;
void bfs(vector>& nums, int start, vector& flag, vector& res) {
queue 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> nums = { { 1 },{ 2,3 },{ 0 },{ 0,2 },{ 5,6 },{ 1 },{ 3,5 } };
vector flag(nums.size(), false);
vector 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;
}
}
#include
#include
using namespace std;
void dfs(vector>& nums, int start, vector& flag, vector& 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> nums = { { 1 },{ 2,3 },{ 0 },{ 0,2 },{ 5,6 },{ 1 },{ 3,5 } };
vector flag(nums.size(), false);
vector 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;
}
}