本文图的存储结构是基于无向图的邻接多重表实现的

图的深度优先搜索的递归遍历

void DFS(AMLGraph G, int i) {cout << G.adjmulist[i].data << endl;visit[i] = visited;for (int w = FirstAdjVex(G, i); w >= 0; w = NextAdjVex(G,i,w)) {//cout << w << endl;if (visit[w] == unvisited) {DFS(G, w);}}
}void DFSTraverse(AMLGraph G) {for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}for (int i = 0; i < G.vexnum; i++) {if (visit[i] == unvisited) {DFS(G, i);}}
}

图的深度优先搜索的非递归遍历

void DFStack(AMLGraph G) {stack<int> a;for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}for (int i = 0; i < G.vexnum; i++) {if (visit[i] == unvisited) {visit[i] = visited;cout << G.adjmulist[i].data << endl;a.push(i);while (!a.empty()) {int v = a.top();bool find = false;for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G,v,w)) {if (visit[w] == unvisited) {a.push(w);visit[w] = visited;cout << G.adjmulist[w].data << endl;find = true;break;}}if (find == false) {a.pop();}}}}
}

图的深度优先搜索实现查找两点间的简单路径

int DFSPath(AMLGraph G, string v1, string v2) {int i1 = LocateVex(G.adjmulist, G.vexnum, v1);int i2 = LocateVex(G.adjmulist, G.vexnum, v2);stack<int> a;list<int> b;for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}visit[i1] = visited;a.push(i1);b.push_back(i1);if (i1 == i2) {cout << v1 << endl;return 1;}while (!a.empty()) {int v = a.top();bool adjem = false;for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) {if (visit[w] == unvisited) {a.push(w);b.push_back(w);visit[w] = visited;if (w == i2) {for (auto iter = b.begin(); iter != b.end(); iter++) {if (iter == b.begin())cout << G.adjmulist[(*iter)].data;elsecout << "->" << G.adjmulist[(*iter)].data;}cout << endl;return 1;}adjem = true;break;}}if (adjem == false) {a.pop();b.pop_back();}}cout << "Not Find!" << endl;return 0;
}

最后附上完整代码:

//无向图的邻接多重表
//深度优先搜索的递归以及非递归实现
//从一节点出发到另一个节点的简单路径
#include <iostream>
#include <stack>
#include <list>
using namespace std;
#define MAX_VERTEX_NUM 20
enum VisitIf {unvisited, visited};
VisitIf visit[MAX_VERTEX_NUM];
class EBox {public:VisitIf mark; //访问标记int ivex, jvex; //该边依附的两个顶点位置EBox *ilink, *jlink; //分别指向依附这两个顶点的下一条边
};class VexBox {public:string data;EBox *firstedge; //指向第一条依附该顶点的边
};class AMLGraph {public:VexBox adjmulist[MAX_VERTEX_NUM];int vexnum, edgenum; //无向图的当前顶点数和边数
};int LocateVex(VexBox adj[], int num, string v) {for (int i = 0; i < num; i++) {if (adj[i].data == v) {return i;}}
}void CreateGraph(AMLGraph *G) {cout << "请输入顶点数和弧数: " << endl;cin >> G->vexnum >> G->edgenum;cout << "请输入顶点: " << endl;for (int i = 0; i < G->vexnum; i++) {cin >> G->adjmulist[i].data;G->adjmulist[i].firstedge = NULL;}for (int i = 0; i < G->edgenum; i++) {cout << "请输入边的两个顶点: " << endl;string v1, v2;cin >> v1 >> v2;int i1 = LocateVex(G->adjmulist, G->vexnum, v1);int i2 = LocateVex(G->adjmulist, G->vexnum, v2);//cout << i1 << "...." << i2 << endl;EBox *p = new EBox;p->mark = unvisited;p->ivex = i1;p->jvex = i2;p->ilink = G->adjmulist[i1].firstedge;p->jlink = G->adjmulist[i2].firstedge;G->adjmulist[i1].firstedge = p;G->adjmulist[i2].firstedge = p;}
}int FirstAdjVex(AMLGraph G, int v) {int i = v;if (G.adjmulist[i].firstedge) {if (G.adjmulist[i].firstedge->ivex == i) {return G.adjmulist[i].firstedge->jvex;}else {return G.adjmulist[i].firstedge->ivex;}}elsereturn -1;
}
//v是G中的某个顶点,w是v的邻接顶点
//返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接点,则返回空int NextAdjVex(AMLGraph G, int v, int w) {int i1 = v;int i2 = w;EBox *p = G.adjmulist[i1].firstedge;while (p) {if (p->ivex == i1 && p->jvex != i2) {p = p->ilink;}else {if (p->ivex != i2 && p->jvex == i1) {p = p->jlink;}else {break;}}}if (p && p->ivex == i1 && p->jvex == i2) {p = p->ilink;if (p&&p->ivex == i1) {return p->jvex;}else if (p&&p->jvex == i1)return p->ivex;}if (p && p->ivex == i2 && p->jvex == i1) {p = p->jlink;if (p&&p->ivex == i1) {return p->jvex;}else if (p&&p->jvex == i1)return p->ivex;}return -1;
}void DFS(AMLGraph G, int i) {cout << G.adjmulist[i].data << endl;visit[i] = visited;for (int w = FirstAdjVex(G, i); w >= 0; w = NextAdjVex(G,i,w)) {//cout << w << endl;if (visit[w] == unvisited) {DFS(G, w);}}
}void DFSTraverse(AMLGraph G) {for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}for (int i = 0; i < G.vexnum; i++) {if (visit[i] == unvisited) {DFS(G, i);}}
}void DFStack(AMLGraph G) {stack<int> a;for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}for (int i = 0; i < G.vexnum; i++) {if (visit[i] == unvisited) {visit[i] = visited;cout << G.adjmulist[i].data << endl;a.push(i);while (!a.empty()) {int v = a.top();bool find = false;for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G,v,w)) {if (visit[w] == unvisited) {a.push(w);visit[w] = visited;cout << G.adjmulist[w].data << endl;find = true;break;}}if (find == false) {a.pop();}}}}
}
int DFSPath(AMLGraph G, string v1, string v2) {int i1 = LocateVex(G.adjmulist, G.vexnum, v1);int i2 = LocateVex(G.adjmulist, G.vexnum, v2);stack<int> a;list<int> b;for (int i = 0; i < G.vexnum; i++) {visit[i] = unvisited;}visit[i1] = visited;a.push(i1);b.push_back(i1);if (i1 == i2) {cout << v1 << endl;return 1;}while (!a.empty()) {int v = a.top();bool adjem = false;for (int w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w)) {if (visit[w] == unvisited) {a.push(w);b.push_back(w);visit[w] = visited;if (w == i2) {for (auto iter = b.begin(); iter != b.end(); iter++) {if (iter == b.begin())cout << G.adjmulist[(*iter)].data;elsecout << "->" << G.adjmulist[(*iter)].data;}cout << endl;return 1;}adjem = true;break;}}if (adjem == false) {a.pop();b.pop_back();}}cout << "Not Find!" << endl;return 0;
}
void PrintGraph(AMLGraph G)
{EBox *p;for(int i = 0; i < G.vexnum; ++i){p = G.adjmulist[i].firstedge;while(p != NULL){if(p->ivex == i)    //判断相等才能知道连接上的是ivex还是jvex;{cout <<  G.adjmulist[p->ivex].data << "------" << G.adjmulist[p->jvex].data << endl;//printf("%d--%d\n", G.adjmulist[p->ivex].data, G.adjmulist[p->jvex].data);p = p->ilink;}else{cout <<  G.adjmulist[p->jvex].data << "------" << G.adjmulist[p->ivex].data << endl;p = p->jlink;}}}
}
int main () {AMLGraph g;CreateGraph(&g);PrintGraph(g);while (1) {string v1, v2;cout << "请输入你想查询的两点: " << endl;cin >> v1 >> v2;DFSPath(g, v1, v2);}return 0;
}

测试结果:

遍历:

简单路径:

数据结构 || 图深度优先搜索遍历以及求两点间的简单路径相关推荐

  1. 【搜索算法】深度优先搜索遍历

    深度优先,顾名思义是向纵深处遍历树或图,如下图所示: 遍历顺序为1–3–6–9–13–12–5–2–4–8–11–7–10 每次都看向树的右子树,当右子树全部看完后再回到树根向左看(回溯),因此采用堆 ...

  2. 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

    图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下 ...

  3. 数据结构与算法王卓-习题-第六章图-采用邻接矩阵表示图的深度优先搜索遍历(DFS)算法

    目录 算法描述 算法预期效果 重难点 思路 个人解法 测试样例与输出 算法描述 创建图的邻接矩阵, 并输出dfs深度优先搜索遍历结果 算法预期效果 依次输入顶点数,边数,顶点V1~Vn,边A1~An, ...

  4. 图的深度优先搜索遍历

    深度优先搜索遍历 深度优先搜索遍历类似与树的先序遍历,过程如下 (1) 从图中的某个顶点v出发,访问v (2) 找出刚访问过的顶点的第一个未被访问的邻接点,访问该节点.以该节点为新顶点,重复此步骤,直 ...

  5. matlab两点之间的所有路径,引用 在图中搜索两点间的所有路径matlab编程

    引用 在图中搜索两点间的所有路径matlab编程 2018-09-18 function possiablePaths = findPath(Graph, partialPath, destinati ...

  6. 南华大学计算机学院吴取劲,一种基于图深度优先搜索的基本路径集自动生成优化算法-南华大学学报.PDF...

    26 3 ( ) Vol. 26 No. 3 第 卷第 期 南华大学学报 自然科学版 2012 9 Journal of University of South China (Science and ...

  7. 算法6.6 采用邻接表表示图的深度优先搜索遍历

    算法6.6 采用邻接表表示图的深度优先搜索遍历 代码实现 #pragma once #include <iostream>using namespace std;//图的邻接表存储表示 # ...

  8. 输出图中两点间的全部路径

    输出图中两点间的全部路径(可直接测试) 需要提前了解图以及图的存储和遍历的相关知识.回溯递归等要点,以下是具体代码实现 //输出图中一个点到另一个点的所有的路径 #include <iostre ...

  9. JAVA求两点间的距离:

    求两点间的距离 给定 A(x1, y1),B(x2​,y2​) 两点坐标,计算它们间的距离. 输入格式 输入包含四个实数x1​,y1​,x2​,y2​,分别用空格隔开,含义如描述. 输出格式 输出占一 ...

最新文章

  1. Nat. Mach. Intell. | 集成深度学习在生物信息学中的发展与展望
  2. _id 和 ObjectId
  3. python中一共有多少个关键字-python 查看所有的关键字
  4. 【星球知识卡片】残差网络家族10多个变种学习卡片,请收下!
  5. IPv6协议简介及与IPv4对比
  6. 实验8.2 指针与字符串 6-2 删除字符
  7. ACdream1157 Segments(CDQ分治 + 线段树)
  8. 说说代码质量、代码安全和软件测试那些事
  9. javascript之querySelector和querySelectorAll
  10. VB程序打包再安装之后不含源码
  11. C语言队列解决舞伴匹配问题
  12. B2B跨境电子商务平台综合服务解决方案
  13. win10声音控制面板扬声器默认设备显示未插入扬声器
  14. K650D安装黑苹果
  15. anywhere 无法正常使用的问题--IP地址解析
  16. 18个免费替代Photoshop的图像编辑软件
  17. P3324 [SDOI2015]星际战争二分答案+网络流
  18. OSChina 周一乱弹 —— 老夫聊发少年狂
  19. 分析Android长按电源键事件并定制长按电源dialog
  20. 京东暑期实习面经(已OC)

热门文章

  1. Jenkins安装教程-包教包会
  2. 求订货点和订货量的matlab,概率统计数学模型2011.ppt
  3. 滑动拼图和文字点选两种类型的验证码
  4. 苹果官网提供“新iPad” 24款超高清应用下载
  5. Nvidia核心技术和用于AI训练的高端工业级显卡
  6. JUnit编写测试用例
  7. 减半行情会不会来?有何投资机会?2020-03-11
  8. ArcGIS开发基础教程(一):API及服务器配置
  9. 笔记:腾讯云直播SDK测试demo
  10. J1900 安装以及配置ubuntu18.04(1)