`
lingyibin
  • 浏览: 193960 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

用BFS找最短路,并打印路径

阅读更多

我想大部分读者都用Floyd或者Dijstra算法,甚至dfs算过最短路吧。

其实BFS也可以计算最短路。(补充:本文只针对无权图,有权图很难用BFS)

当我们用BFS找端对端最短路时,从出发点开始,第一次遍历到终点时过的那条路径就是最短的路径。(读者可以思考一下为什么!)

下面就用邻接表来实现一下BFS最短路,并把路径打出来。

 

#include<iostream>
#include<fstream>
#include<queue>
using namespace std;

const int MAX = 50;

struct link
{
 int data;
 link *next;
};
struct Node
{
 int v;     //顶点相关的信息
 link *next;
};
struct Graph
{
  Node node[MAX+1]; //所有的结点
  int nodeCnt; //用来记录图中结点的数目,这里假设用的是连通图。假设不连通,稍微改一下本程序就行了,具体操作留给读者思考!
};

int visited[MAX+1]; //标志数组
int pa[MAX+1];

/* 读取文件中的数据,构造一个邻接表来表示图 */ 
Graph readGraph()
{
	ifstream cin("c:\\graph.txt");

	//表的初始化
	Graph graph;
	int i ;
	for(i = 1; i < MAX; i ++)
	{
		graph.node[i].v = i;
		graph.node[i].next = NULL;
	}

	int n1 = 0,n2 = 0;
	link *s;
	graph.nodeCnt = 1;//把结点数初始化为1
	while(cin>>n1>>n2)
	{
		if(graph.nodeCnt < n1) graph.nodeCnt=n1;
		if(graph.nodeCnt < n2) graph.nodeCnt=n2;
		s = new link;
		s->data = n2;
		s->next=graph.node[n1].next;
		graph.node[n1].next=s; //从尾部插入
		//delete(s);

		s=new link;
		s->data = n1;
		s->next=graph.node[n2].next;
		graph.node[n2].next=s; //反过来也赋值,说明本程序测试的是无向图,如果是有向图的话读者应该知道怎么改了吧!
		//delete(s);
	}
	return graph;
}

/* 打印邻接表 */ 
void printGraph(Graph graph)
{
  link *p;
  for(int i = 1; i <= graph.nodeCnt; i ++)
  {
	  cout<<graph.node[i].v<<" -- ";

	  p=graph.node[i].next;
	  while(p!=NULL)
	  {
		  cout<<p->data;
		  p=p->next;
		  if(p != NULL) 
			  cout<<",";
	  }
	  cout<<endl;
  }
}

/* 用BFS求最短路径 */ 
void shortestPath(Graph graph, int s, int d)
{
	cout<<"从"<<s<<"到"<<d<<"的bfs最短路求解过程如下:"<<endl;
	queue<int> que ;
	link * p = NULL;
	//int cnt = 0;
	int parents = s;
	memset(visited,0,sizeof(visited));
	memset(pa,0,sizeof(pa));
	visited[s] = 1;
	pa[s] = -1;
	que.push(s);
	while(!que.empty()){
		p = graph.node[que.front()].next;
		parents = que.front();
		que.pop();
		//cnt ++;
		while(p != NULL)
		{
			if(!visited[p->data])
			{
				visited[p->data] = 1;
				pa[p->data] = parents;
				cout<<"访问:"<<p->data<<endl;
				if(p->data == d) //找到了目标结点
				{
					//cout<<"在第"<<cnt<<"层找到目标结点!(出发点算第一层)"<<endl;
					break;
				}
				que.push(p->data);
			}
			p = p->next;
		}
	}
	cout<<"路径如下:"<<endl;
	parents = d;
	//cout<<parents<<" <- ";
	while(pa[parents] != -1)
	{
		cout<<parents<<" <- ";
		parents = pa[parents];
	}
	cout<<parents<<endl;
}

int main()
{
	int s,d;
	Graph graph = readGraph();
	printGraph(graph);
	while(true)
	{
		cout<<"请输入起点和终点:"<<endl;
		cin>>s>>d;
		shortestPath(graph, s , d);
	}
	return 0;
}

 

 

输入文件graph.txt里数据格式如下:

 

1 2 
1 3 
1 4 
2 4
0
1
分享到:
评论

相关推荐

    BFS 找最短路.cpp

    题解:Bfs找最短路径(正解,绝对正确)这是c++中一道题的题解

    人工智能-BFS-8数码问题-路径打印

    **人工智能-BFS-8数码问题-路径打印** 在信息技术领域,人工智能(AI)是一门研究如何使计算机模拟人类智能或学习、推理、感知等能力的学科。在这个领域中,算法扮演着至关重要的角色,比如宽度优先搜索(Breadth ...

    算法设计与实验报告—bfs-based 最短路径

    BFS广泛应用于寻找图中的最短路径、拓扑排序、找出树的层次结构等场景。例如,在社交网络中,BFS可用于查找两个人之间的最少中间人数量,或者在网络路由中找到数据包的最小跳数路径。 在最短路径问题中,BFS可以...

    提取路径广度优先搜索BFS代码C++

    对于最长路径问题,BFS并不总是能找出图中的最长路径,因为它是优先处理最近的节点。但是,如果我们对每个节点维护两个值:一个是最短距离,另一个是到达该节点的最长路径,我们可以通过反向BFS找到起点到所有节点的...

    ZOJ1055-Oh_Those_Achin_Feet.rar_BFS最短路径_ZOJ1055_bfs求最短路径_zoj

    在图的最短路径问题中,BFS通常用于找出两节点间的最短路径,特别是当边的权重都为1时,BFS可以找到具有最少边数的路径,即最短路径。 在标签中,"bfs最短路径"和"zoj1055 bfs求最短路径"进一步强调了题目要求用BFS...

    test_1_DFS_BFS.rar_bfs_bfs路径_dfs_寻路_自动寻路

    通过实际运行和比较,我们可以看到DFS可能在某些情况下产生较长的路径,而BFS则能更快找到最短路径。 文件"www.pudn.com.txt"可能包含了关于这个项目的额外信息或者源代码注释,而"test_1"很可能是项目的主要代码...

    Haskell-找出有向图的所有最短路

    利用邻接列表、广度优先搜索和队列数据结构,我们可以有效地找出图中的最短路径,并通过遍历所有节点来找到所有可能的最短路径。这种方法不仅适用于无负权重的图,也可以通过调整算法来处理存在负权重边的情况。

    广度有限搜索 bfs 基础 骑士的任务 课件

    广度优先搜索(BFS)是一种在图或树中寻找最短路径的搜索算法,它的主要特点是按照层次顺序进行搜索,即从起始节点开始,优先遍历离起始节点更近的节点,再遍历更远的节点。在解决“骑士的任务”这类问题时,BFS尤为...

    C# 自动寻路迷宫(bfs)

    在迷宫寻路问题中,BFS通常用于找到从起点到终点的最短路径,因为它是最早发现所有可能的解决方案。 **C#语言基础** C#是一种面向对象的、类型安全的、现代的编程语言,广泛应用于Windows桌面应用、游戏开发、Web...

    k最短路程序源码.zip

    k最短路算法旨在找出网络中的k条最短路径,这些路径的权重依次递增。这在交通规划、网络设计和资源分配等实际问题中有着广泛应用。常见的k最短路算法有Dijkstra算法的扩展,比如Yen's算法和Eppstein算法。 二、Yen'...

    基于BFS的贪吃蛇

    在贪吃蛇游戏中,我们可以将蛇的当前位置作为起始节点,食物位置作为目标节点,用BFS来找出蛇到达食物的最短路径。 为了实现这个算法,我们首先需要构建游戏环境的表示。我们可以用二维数组或者图形数据结构来表示...

    【二维路径规划】基于Breadth First Search (BFS) 实现二维路径规划附matlab代码

    本篇内容将深入讲解如何利用宽度优先搜索(Breadth First Search, BFS)算法来解决这一问题,并结合MATLAB编程环境进行实践。 BFS是一种图论中的搜索算法,适用于查找树或图中最短路径。它以广度为优先级,从起始...

    bfs.rar_bFS maze_bfs

    总之,BFS算法在迷宫求解中起到了关键作用,它能有效地找出从起点到目标点的最短路径。通过理解BFS的工作原理和实现细节,我们可以编写出高效的迷宫求解程序。在`bfs.cpp`中,你可以学习到如何将这些理论知识转化为...

    最大流的BFS搜索最大容量路径算法

    用BFS寻找剩余图的最大流值,再进行优化

    广度优先搜索BFS-VC6.0全工程

    BFS确保了最早找到的路径是最短的,因为它是沿着最短的距离向外扩展的。 ### 二、MFC框架介绍 MFC是微软为Windows应用程序开发提供的一套C++类库,它封装了Windows API,使得开发者能更高效地编写Windows应用程序...

    八数码BFS,DFS,BBFS,Astar实现

    在八数码问题中,BFS通常能找出最短的步数解,因为它总是先探索更接近目标的状态。BFS使用队列数据结构来存储待访问的节点,确保先访问最近的节点。 其次,**深度优先搜索(DFS)**是一种深入探索树或图的分支,...

    BFS和DFS算法可视化(js实现)

    **BFS(广度优先搜索)与DFS(深度优先搜索)是图论和树结构中常用的两种搜索算法,主要用于遍历或查找树或图。在本项目中,这两种算法通过JavaScript语言进行了可视化实现,旨在帮助学习者更好地理解和掌握这两种...

    k最短路 程序 c 与java版本!

    在计算机科学领域,"k最短路"(k Shortest Paths,KSP)问题是一个经典图论问题,它涉及到寻找图中的k条具有最短路径的路径。这个问题在路由算法、网络规划、交通工程以及多目标优化等领域有着广泛应用。本讨论将...

    搜索bfs,dfs

    BFS通常用于找出两个节点之间的最短路径,因为它总是先检查较近的节点。在实现BFS时,我们通常使用队列数据结构来存储待访问的节点。 深度优先搜索(DFS)则是另一种盲目搜索策略,它尽可能深地探索树或图的分支。...

Global site tag (gtag.js) - Google Analytics