深度优先遍历寻找图中两节点之间所有路径
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if (find(path.begin(), path.end(), G.V[j]) != path.end())
-2-
continue; //如果 j 所对应的顶点在路径中,就不遍历该顶 点,否则遍历
if (G.E[index][j] == 1) DFS(G.V[j],E);
} path.pop_back(); //返回上一层时删除路径末尾值 }
int B, E; cout << "输入所求路径的起始点和终止点的值:" << endl; cin >> B >> E;
cout << "由" << B << "到" << E << "的路径为:" << endl; DFS(B,E);
-3-
system("pause"); } 代码中所用例图为:
cout << endl; path.pop_back(); //返回上一层时删除路径末尾值Fra Baidu bibliotekreturn; }
//如果未找到终点,继续深度遍历 int index = find(G.V.begin(), G.V.end(), B) - G.V.begin(); for (int j = 0; j < (int)G.V.size(); j++) {
-4-
深度优先遍历寻找图中两节点之间所有路径
李荣贵 < 东南大学计算机科学与信息学院 南京 >
前段时间写程序时用到深度优先算法寻找图中两点之间的路径, 发现网上相关的文章比较少,有的还有问题,就写了这篇文章,以供 新手们参考学习,以下代码都已经过测试,欢迎大家与我探讨交流!
程序中的图是无向无权图,我使用邻接矩阵表示,如果两个顶点 之间有边,对应的邻接矩阵相应位置的值为 1,否则为 0。遍历过程 中用一个全局变量 path 保存路径,在遍历下一节点之前需判断该节 点是否在路径中,如果在则不遍历该节点,否则遍历,这样可以防止 遍历出现死循环。遍历到某节点时,将其保存到 path 中,递归返回 上一层前,需从 path 中删除当前节点,由于递归在两种情况下返回 上一层:一,找到终点;二,该节点的邻节点已遍历完;故代码中有 两条“path.pop_back();”语句。接下来给出源代码:
void DFS(int B,int E) //深度遍历图 {
path.push_back(B); //保存顶点值到路径中 if (E == B) //如果找到了终点,输出路径 {
for (auto it = path.begin(); it != path.end(); ++it) cout << *it << " ";
void main() {
vector<int> V = { 2, 6, 7, 9 }; G.V = V; vector<vector<int>> edges = { { 0, 1, 1, 0 }, { 1, 0, 1, 1 }, { 1, 1, 0, 1 }, { 0, 1, 1, 0 } }; G.E = edges;
#include <iostream> #include <vector> #include <algorithm> using namespace std;
struct Graph {
vector<int> V; //保存图中顶点的值
-1-
vector<vector<int>> E; //图的邻接矩阵 }; Graph G; vector<int> path; //用于保存遍历过程中所走过的顶点值
-2-
continue; //如果 j 所对应的顶点在路径中,就不遍历该顶 点,否则遍历
if (G.E[index][j] == 1) DFS(G.V[j],E);
} path.pop_back(); //返回上一层时删除路径末尾值 }
int B, E; cout << "输入所求路径的起始点和终止点的值:" << endl; cin >> B >> E;
cout << "由" << B << "到" << E << "的路径为:" << endl; DFS(B,E);
-3-
system("pause"); } 代码中所用例图为:
cout << endl; path.pop_back(); //返回上一层时删除路径末尾值Fra Baidu bibliotekreturn; }
//如果未找到终点,继续深度遍历 int index = find(G.V.begin(), G.V.end(), B) - G.V.begin(); for (int j = 0; j < (int)G.V.size(); j++) {
-4-
深度优先遍历寻找图中两节点之间所有路径
李荣贵 < 东南大学计算机科学与信息学院 南京 >
前段时间写程序时用到深度优先算法寻找图中两点之间的路径, 发现网上相关的文章比较少,有的还有问题,就写了这篇文章,以供 新手们参考学习,以下代码都已经过测试,欢迎大家与我探讨交流!
程序中的图是无向无权图,我使用邻接矩阵表示,如果两个顶点 之间有边,对应的邻接矩阵相应位置的值为 1,否则为 0。遍历过程 中用一个全局变量 path 保存路径,在遍历下一节点之前需判断该节 点是否在路径中,如果在则不遍历该节点,否则遍历,这样可以防止 遍历出现死循环。遍历到某节点时,将其保存到 path 中,递归返回 上一层前,需从 path 中删除当前节点,由于递归在两种情况下返回 上一层:一,找到终点;二,该节点的邻节点已遍历完;故代码中有 两条“path.pop_back();”语句。接下来给出源代码:
void DFS(int B,int E) //深度遍历图 {
path.push_back(B); //保存顶点值到路径中 if (E == B) //如果找到了终点,输出路径 {
for (auto it = path.begin(); it != path.end(); ++it) cout << *it << " ";
void main() {
vector<int> V = { 2, 6, 7, 9 }; G.V = V; vector<vector<int>> edges = { { 0, 1, 1, 0 }, { 1, 0, 1, 1 }, { 1, 1, 0, 1 }, { 0, 1, 1, 0 } }; G.E = edges;
#include <iostream> #include <vector> #include <algorithm> using namespace std;
struct Graph {
vector<int> V; //保存图中顶点的值
-1-
vector<vector<int>> E; //图的邻接矩阵 }; Graph G; vector<int> path; //用于保存遍历过程中所走过的顶点值