C最短路径Dijkstra算法如何实现
更新时间:2023-10-03什么是Dijkstra算法
Dijkstra算法是求解图中单源最短路径的一种贪心算法。它能够找到源点到所有其他节点的最短路径,并且具有良好的时间复杂度。Dijkstra算法采用一种广度优先的搜索策略,与深度优先搜索不同,它使用一个集合S来存放已经求出最短路径的节点,而不是用一个队列来存放到达每个节点的路径。
template
void Graph::Dijkstra(T startVertex) {
unordered_set visited;
priority_queue, vector>, greater>> pq;
unordered_map dist;
pq.push({startVertex, 0});
for(auto vertex: adjacencyList) {
dist[vertex.first] = INT_MAX;
}
dist[startVertex] = 0;
while(!pq.empty()) {
T temp = pq.top().first;
pq.pop();
visited.insert(temp);
for(auto neighbor: adjacencyList[temp]) {
if(visited.find(neighbor.first) == visited.end()) {
int alt = dist[temp] + neighbor.second;
if(alt < dist[neighbor.first]) {
dist[neighbor.first] = alt;
pq.push({neighbor.first, dist[neighbor.first]});
}
}
}
}
PrintDistances(dist, startVertex);
}
Dijkstra算法的实现
Dijkstra算法的实现过程非常简单,主要分为以下几个步骤:
- 创建一个集合S来存放已经求出最短路径的节点,以及一个优先队列pq。
- 初始化源点startVertex的距离为0,其他顶点的距离为无穷大。
- 将源点加入到pq中。
- 从pq中取出dist最小的节点temp,将temp加入到S中。
- 对temp的所有邻居,更新其距离值,如果修改后的距离值小于原来的距离值,则将该节点加入到pq中。
- 重复步骤4和步骤5,直到pq为空。
- 输出源点到各个节点的最短距离。
unordered_map> adjacencyList;
template
void Graph::AddEdge(T u, T v, int weight) {
adjacencyList[u][v] = weight;
}
template
void Graph::PrintDistances(unordered_map& dist, T startVertex) {
cout<<"Shortest distances from vertex "<
Dijkstra算法的时间复杂度
Dijkstra算法的核心在于每次从pq中取出距离最小的点temp,然后遍历所有可能到达的点,更新其距离值,因此时间复杂度为O(ElogV),其中E是边的数量,V是顶点的数量。它采用了一种贪心策略,每次都选择距离最近的点进行子图划分,这样可以保证得到最短路径。
Dijkstra算法的应用
Dijkstra算法广泛应用于许多领域,例如路线规划、网络优化、机器学习等。在路线规划中,Dijkstra算法可以帮助我们找到两地之间的最短路径,从而节省时间和能源。在网络优化中,Dijkstra算法可以帮助我们找到最优的传输路径,从而提高网络性能。在机器学习中,Dijkstra算法可以用于求解最短路径问题,例如序列标注、语音识别、机器翻译等。
总结:Dijkstra算法是一种贪心算法,用于求解图中单源最短路径,它采用广度优先搜索的策略,利用一个集合S来存放已经求出最短路径的节点,以及一个优先队列pq。Dijkstra算法的时间复杂度为O(ElogV),其中E是边的数量,V是顶点的数量。Dijkstra算法广泛应用于许多领域,例如路线规划、网络优化、机器学习等。