Dijkstra算法实现类—提高,邻接表+优先队列

原创 2012年03月24日 16:32:38

总觉得前点时间写的Dijkstra,有点繁琐,还是用回邻接表和优先队列感觉舒服点。

废话就不多说了,原先那篇邻接矩阵的Dijkstra链接如下:http://blog.csdn.net/betabin/article/details/7375803

这次改为优先队列,则需要一个Vertex结构,记录其序号及到起点的cost。每次push进去队列之前,都刷新其最新cost。并且加了些辅助变量,如判断是否已经处理过该节点的bool数组等。改用邻接表的话,则是感觉空间比较好,感觉也是比较舒服。

这次的代码如下:

#include <iostream>
#include <queue>

#define MAX_EDGE 30
#define MAX_VERTEX 10
#define INFINITE 0x7fffffff
#define AL_END -1

using namespace std;

struct Vertex 
{
	int vertex;
	int cost;
};

bool operator < (const Vertex &a, const Vertex &b)
{
	return a.cost > b.cost;
}

struct AlEdge 
{
	int next;
	int vertex;
	int cost;
};

class AlGraph
{
public:
	int source;
	int destination;

	int edgeNum;
	int vertexNum;

	int allCost;

	void Dijkstra();

private:
	AlEdge edge[MAX_EDGE];
	priority_queue<Vertex> nextVertexQueue;
	int alVertex[MAX_VERTEX];
	bool vertexDealed[MAX_VERTEX];

	void initialize();
	void geteData();
};

void AlGraph::geteData()
{
	cout << "Please input the number of vertex: ";
	cin >> vertexNum;

	cout << "Please input the number of edge: ";
	cin >> edgeNum;

	cout << "Please input the source: ";
	cin >> source;

	cout << "Please input the destination: ";
	cin >> destination;

	cout << "Please input the edges.(source, destination, cost.)" << endl;
	int s, d, c;
	int ip = 0;
	for (int i = 0; i < edgeNum; i++)
	{
		cin >> s >> d >> c;
		edge[ip].next = alVertex[s];
		edge[ip].vertex = d;
		edge[ip].cost = c;
		alVertex[s] = ip++;
	}
}

void AlGraph::initialize()
{
	memset(alVertex, AL_END, sizeof(alVertex));
	memset(vertexDealed, 0, sizeof(vertexDealed));

	allCost = 0;

	while (!nextVertexQueue.empty())
	{
		nextVertexQueue.pop();
	}

	geteData();
}

void AlGraph::Dijkstra()
{
	initialize();

	Vertex currentVertex;
	currentVertex.cost = 0;
	currentVertex.vertex = source;
	nextVertexQueue.push(currentVertex);

	while (!nextVertexQueue.empty())
	{
		currentVertex = nextVertexQueue.top();
		nextVertexQueue.pop();

		if (currentVertex.vertex == destination)
		{
			break;
		}

		if (vertexDealed[currentVertex.vertex])
		{
			continue;
		}

		vertexDealed[currentVertex.vertex] = true;

		Vertex nextVertex;
		for (int i = alVertex[currentVertex.vertex]; i != AL_END; i = edge[i].next)
		{
			if (!vertexDealed[edge[i].vertex])
			{
				nextVertex.vertex = edge[i].vertex;
				nextVertex.cost = currentVertex.cost + edge[i].cost;
				nextVertexQueue.push(nextVertex);
			}
		}

	}

	if (currentVertex.vertex == destination)
	{
		allCost = currentVertex.cost;
	}
	else
	{
		allCost = INFINITE;
	}
}

int main()
{
	AlGraph test;

	test.Dijkstra();
	cout << "The smallest cost is: " << test.allCost << endl;

	return 0;
}


图算法 单源最短路径 Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一、前言   最短路径算法,顾名思义就是求解某点到某点的最短的距离、消耗、费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离。比方说,我们把地图上的每一个城...
  • tham_
  • tham_
  • 2015年05月27日 17:07
  • 961

(转)图算法单源最短路径Dijkstra算法(邻接表/邻接矩阵+优先队列STL)

一、前言  最短路径算法,顾名思义就是求解某点到某点的最短的距离、消耗、费用等等,有各种各样的描述,在地图上看,可以说是图上一个地点到达另外一个地点的最短的距离。比方说,我们把地图上的每一个城市想象成...

hdu 2544 最短路(Dijkstra 邻接表+优先队列)

题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others...

UVA - 10986 Sending email (Dijkstra邻接表+优先队列优化)

题目大意: 给一个图, 求从s点到t点的最小距离。 解析: 赤裸裸的最短路,但n太大显然是不能用邻接矩阵的,需要对Dijkstra用邻接表+优先队列优化。 这里我把Dijkstra的邻接表...

Dijkstra[两种邻接表+优先队列优化]

Dijksta算法中,如果我们采用的是邻接矩阵来存的,第一点浪费的空间比较多,第二点我们知道算法的时间复杂度在O(n*n),这样的算法可以说并不是很好,所以我们考虑优化它首先我们可以优化存储结构,采用...

【HDU 1874 2544 2066 2112】 Dijkstra单源最短路径专题 —— 优先队列+邻接表/邻接矩阵

分别基于邻接表和邻接矩阵,采用优先队列高效实现Dijkstra最短路径算法。 Dijkstra练习题库...

hdu 1874 畅通工程续 dijsktra dijkstra+邻接表 优先队列 bellman-ford bellman-ford队列优化(基础题目,一步步优化)

又是一道最短路基础题目,注意两点就可以了: 1.输入的时候可能会两点之间有多条路,选最短的存起来。 2.判断有没有路径存在,可以判断一下终点到起点的距离是否小于原来初始化的最大值,如果是就输出结果,否...

ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。

(一) 所有边权均为正,不管有没有环,

Dijkstra 算法用优先队列的java实现

dijkstra这个算法的意思百度下大概就能明白。我主要讲的是如何实现。 首先,我们如何用java去保存一张有向图? 我用hashmap去存它的起点位置,然后value用list加节点的方式,感觉...

已经实现了最短距离的优先队列dijkstra算法,怎么回溯出最短距离路线上经过的点呢?

 //此程序成功找到了邻接矩阵中两点的最短距离长度,但是没有实现路径中经过的点的显示  #include   #include   #include   using namespace...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Dijkstra算法实现类—提高,邻接表+优先队列
举报原因:
原因补充:

(最多只允许输入30个字)