C++ 图的广度优先遍历 ,如何再次基础上算出其最短路径

#include "error.h"
#include "random.h"
#include "Vector.h"
#include "Set.h"
#include "queue.h"

#ifdef _MAP_H
#define _MAP_H

#endif

struct nodeT;

struct arcT{
int distance;
std::string name;
nodeT *start,*end;
};

struct nodeT{
//node (name etc)

std::string name;
Vector<arcT*> outgoing;
};

/*深度优先遍历*/
void Depth(nodeT *cur,Set<std::string> &visited)
{
if(visited.contains(cur->name)) return;
visited.add(cur->name);

for(int i = 0;i<cur->outgoing.size();i++)
{
Depth(cur->outgoing[i]->start,visited);
Depth(cur->outgoing[i]->end,visited);
}
}

/*最短路径问题?*/
/*迷宫问题?*/
/*how to print the route*/
/**
如何打出他们所有的联通路径
然后算出他们的最短路径
*/
void BreadFirstSearch(nodeT * start)
{
Queue<nodeT*> q;
Set<std::string> visited;
q.enqueue(start);

while(!q.isEmpty())
{
nodeT* cur=q.dequeue();
if(!visited.contains(cur->name))
{
visited.add(cur->name);
for(int i = 0;i<start->outgoing.size();i++)
q.enqueue(cur->outgoing[i]->end);
}
}
}

void PrintBreadFirstSearch(nodeT * start)
{
Queue<nodeT*> q;
Set<std::string> visited;
q.enqueue(start);

while(!q.isEmpty())
{
nodeT* cur=q.dequeue();

cout<<"遍历的节点名称"<<cur->name<<endl;

if(!visited.contains(cur->name))
{
visited.add(cur->name);
for(int i = 0;i<cur->outgoing.size();i++)
q.enqueue(cur->outgoing[i]->end);
}
}
}

/*广度优先遍历*/

int main(int argc, char **argv)
{
nodeT *A,*B,*C;

A =(nodeT*) new nodeT;
B=(nodeT*) new nodeT;
C =(nodeT*) new nodeT;

A->name = "A";
B->name = "B";
C->name = "C";
arcT *arc1,*arc2,*arc3;
arc1 =(arcT*) new arcT;
arc2 =(arcT*) new arcT;
arc3 =(arcT*) new arcT;

arc1->distance = 10;
arc1->name = "a1";
arc1->start = A;
arc1->end = B;

arc2->distance = 20;
arc2->name = "a2";
arc2->start = A;
arc2->end = C;

arc3->distance = 7;
arc3->name = "a3";
arc3->start = B;
arc3->end = C;

A->outgoing.add(arc1);
A->outgoing.add(arc2);
B->outgoing.add(arc3);

PrintBreadFirstSearch(A);

system("pause");
return 0;
}

(1)由于你的深度遍历记录结点或弧,只记录了结点名,因此,不能根据visited集合打印出最短距离
(2)由于路径必须设定起、始结点,因此,也不能简单根据visited或一个结点打印出两点间任意路径。
实事上:
(1)你可以用Dijistra算法求任意两点间短径
(2)用深度遍历结合回溯算法求两点间所有路径
这两个算法你可以在网上搜索到。
温馨提示:内容为网友见解,仅供参考
无其他回答

广度优先搜索为什么可以找出最短路径
1、首先,广度优先搜索可以理解为按层次遍历。而广度优先搜索只可以解决无权图(有权的的所有权值均相等,这样的有权图也可以理解为无权图)2、那么可以为相同层次的结点编上统一的序号。如第一层节点都为1,第二层节点都为2...3、我们就可以将整张图都编上号,分别代表从起点到任意结点的层次,...

广度优先算法求最短路径
广度优先算法是一种常用的图论算法,用于求解最短路径问题。该算法从起点开始,逐层遍历图中的节点,直到找到目标节点为止。在遍历过程中,记录每个节点的距离和前驱节点,最终得到起点到目标节点的最短路径。广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算...

数据结构算法 用C++ 迷宫最短路径
一般迷宫寻路可以用递归的算法,或者用先进后出的栈数据结构实现 用的是深度优先的算法,可以寻找到走出迷宫的路径 但本题要求求出最短的路径,这就要使用广度优先的算法 一般在程序中需要用到先进先出的队列数据结构 下面是程序的代码,主要原理是用到 quei,quej和prep三个数组来构成队列 分别储存路径...

广度优先遍历广度优先遍历的性质
1. 广度优先生成树:在进行广度优先遍历时,每次访问并记录所经过的结点和边,可以构建出一个子图。这个子图以起始结点作为根节点,形成一棵树,称之为广度优先生成树。这种树的构建方式与深度优先遍历生成的树相似。2. 最短路径:广度优先遍历具有寻找图中两点间最短路径的能力。从起始结点v0出发,遍历...

...图的深度优先、广度优先遍历算法 3验证最短路径
\/\/ Description: 深度优先搜索并输出 \/\/ Input: Graph - 图; n - 图的结点的个数; StartEdge — 开始的结点;\/\/ Output: Console下输出遍历的顺序 \/\/ Tags: 递归调用 _dfs过程、回溯算法 void _dfs(Edge **&graph, bool *visited, int n, int index);void DFS(Edge **&graph, int n...

广度优先遍历的性质
这种情况与深度优先遍历类似。类似地,也可以给广度优先生成树结点定义时间戳。2、最短路径显然,从v0出发广度优先遍历图,将得到v0到它的各个可达到的路径。我们这里定义路径上的边的数目为路径长度。与深度优先遍历不同,广度优先遍历得到的v0到各点的路径是最短路径(未考虑边权)。

详细介绍广度优先搜索的实现,原理,c++程序
对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和未找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和...

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)
广度优先搜索是一种优先遍历图形中所有相邻节点的算法。它从根节点开始,按层次遍历树的节点,直到找到所需结果。BFS使用队列数据结构来存储待访问的节点。基本步骤:1. 对给定的连通图进行初始化,所有节点标记为未访问。2. 将起点节点标记为灰色,即待访问状态。3. 访问灰色节点,并将其标记为黑色,即...

图的遍历
广度优先遍历是另一种图的遍历方法,它与深度优先遍历不同,广度优先遍历按照层次顺序访问图中的节点。它从根节点开始,逐层向下搜索图的每一个相邻节点,直到覆盖整个图的所有节点。这种方法的典型应用包括在图中寻找最短路径或检测是否存在某个特定的路径等。广度优先遍历通常需要用到队列数据结构来存储待...

深度优先和广度优先各有什么特点?

广度优先遍历(BFS):1. 从一个起始顶点开始,遍历该顶点所有邻接顶点,然后再遍历这些邻接顶点的邻接顶点,依次类推。2. 采用队列实现遍历过程,遵循先进先出(FIFO)原则。3. 优先遍历距离起始顶点较近的顶点,即先访问顶点的层次较浅。4. 适用于寻找某个目标顶点的最短路径,以及分析...

相似回答