单源最短路径打印邻接矩阵
时间: 2023-11-21 07:53:52 浏览: 127
单源最短路径打印邻接矩阵是指在使用迪杰斯特拉算法求解有向图的单源最短路径时,将有向图用邻接矩阵来存储,并实现路径存储和路径打印的过程。在这个过程中,我们需要使用一个数组来存储每个节点的前驱节点,以便在最短路径被找到后,能够通过前驱节点数组逆向遍历路径并打印出来。具体实现过程可以参考引用中提供的Python代码。
相关问题
图算法 单源最短路径 Dijkstra算法(邻接表/邻接矩阵+优先队列STL)
Dijkstra算法是解决单源最短路径问题的一种经典算法,其基本思想是利用贪心的思想,每次选取未确定最短路径的节点中距离起点最近的节点,然后根据该节点更新与该节点相邻的节点的距离。具体实现可以采用邻接表或邻接矩阵来表示图,同时利用优先队列STL来维护节点距离的更新。
算法步骤如下:
1.初始化:将起点的距离设置为0,其余节点的距离设置为无穷大,将所有节点标记为未确定最短路径。
2.选择当前距离起点最近的未确定最短路径节点,将其标记为确定最短路径,并更新其相邻节点的距离。
3.重复步骤2直到终点被标记为确定最短路径或者所有节点均被标记为确定最短路径。
4.输出最短路径。
使用邻接表可以较为简便地实现Dijkstra算法,具体实现如下:
```c++
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100010;
const int INF=0x3f3f3f3f;
struct Edge{
int to,w;
};
vector<Edge> G[MAXN];
int dis[MAXN];
bool vis[MAXN];
void dijkstra(int s){
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
memset(dis,INF,sizeof(dis));
memset(vis,false,sizeof(vis));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=true;
for(int i=0;i<G[u].size();i++){
int v=G[u][i].to;
int w=G[u][i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(make_pair(dis[v],v));
}
}
}
}
int main(){
int n,m,s,t;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].push_back((Edge){v,w});
G[v].push_back((Edge){u,w});
}
dijkstra(s);
printf("%d\n",dis[t]);
return 0;
}
```
其中,邻接表G[u]表示节点u的相邻节点,Edge结构体表示边的信息,dis[u]表示起点到节点u的最短路径长度,vis[u]表示节点u是否被标记为确定最短路径。使用优先队列STL来维护节点距离的更新,pair<int,int>表示节点距离和节点编号,greater<pair<int,int>>表示节点距离的比较器,使得距离小的节点在队列前面。
单源最短路径算法代码
在Python中,常见的单源最短路径算法有Dijkstra算法(适用于非负权边)和Floyd-Warshall算法(适用于任意权重,但不支持负权重环)。这里我会演示如何使用Python实现Dijkstra算法。
首先,我们需要定义一个图的数据结构。我们可以用字典或邻接矩阵来表示:
```python
def dijkstra(graph, start):
distances = {node: float('inf') for node in graph}
distances[start] = 0
previous_nodes = {}
while len(distances) != len(graph): # 检查是否所有节点都访问过
current_node, min_distance = None, float('inf')
for node, distance in distances.items():
if distance < min_distance and node not in previous_nodes:
min_distance = distance
current_node = node
if current_node is None: # 如果没有未访问的节点,说明已找到所有最短路径
break
for neighbor, weight in graph[current_node].items(): # 更新邻居的距离
new_distance = distances[current_node] + weight
if new_distance < distances[neighbor]:
distances[neighbor] = new_distance
previous_nodes[neighbor] = current_node
return distances, previous_nodes
```
这个`dijkstra`函数接受一个邻接列表形式的图(键是起点,值是另一个字典,其中键是终点,值是权重),以及起点。它返回两个结果:一个是每个节点到起点的最短距离,另一个是构建最短路径时的前驱节点信息。
阅读全文