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
  • 841

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

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

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

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

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

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

dijsttra 邻接表+优先队列

dijstra原理: 以单源开始,每次以新的点去更新所有的(没访问过的点) 到单源的最短路。        其中新的点---------应该找每次更新后当前到单源权值最小的点. 作法一:邻接矩阵...

Dijkstra算法实现类—邻接矩阵,一般实现

(在后面更新了Dijkstra算法的实现,用邻接表+优先队列实现。链接如下:http://blog.csdn.net/betabin/article/details/7390403) 有向权图关于单...

哈理工oj/hrbust 2122 旅行【dij+优先队列优化+邻接表+map】

hrbust 2122,哈理工oj 2122

HDU1285基于有向图邻接表的优先队列的拓扑排序

#include #include using namespace std; //有向图的邻接表 typedef struct v { int vex;//终点的序号 v *next;//与...

[hdu1285]拓扑排序模板 邻接表加优先队列简单易懂

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S...

POJ-1724-ROADS(优先队列,邻接表,BFS)

E - ROADS Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u SubmitStatu...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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