堆优化 Dijstra单源最短路径算法 2(邻接表)

本文深入探讨了堆优化迪杰斯特拉算法的实现细节,并通过实例展示了其在解决最短路径问题中的高效应用。文章详细介绍了算法的关键步骤、优化策略以及在实际场景中的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include"iostream"
#include"cstdio"


using namespace std;


int u[100];
int v[100];
int w[100];
int first[100];
int next[100];
int n,m;
int dis[100];
int heap[100];
int k;
int minpoint;
int inf=9999999;


void swap(int x,int y)
{
int t=heap[x];
heap[x]=heap[y];
heap[y]=t;
}


void siftdown(int i)
{
int t,flag=0;
while(flag==0&&i*2<=n)
{
if(dis[heap[i]]>dis[heap[i*2]])
{
t=i*2;
}
else
{
t=i;
}
if(i*2+1<=n)
{
if(dis[heap[t]]>dis[heap[i*2+1]])
{
t=i*2+1;
}
}
if(i!=t)
{
swap(i,t);
i=t;
}
else
{
flag=1;
}
}
}


int pop()
{
int t=heap[1];
heap[1]=heap[n];
n--;
siftdown(1);
return t;
}


int main()
{
cin>>n>>m;
k=n;
for(int i=1;i<=n;i++)
{
first[i]=-1;
dis[i]=inf;
}
dis[1]=0;
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i]>>w[i];
next[i]=first[u[i]];
first[u[i]]=i;
if(u[i]==1)
{
dis[v[i]]=w[i];

}
for(int i=1;i<=n;i++)
{
heap[i]=i;
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
int z=pop();
for(int i=1;i<=k-1;i++)
{
minpoint=pop();
int t=first[minpoint];
while(t!=-1)
{
if(dis[v[t]]>dis[u[t]]+w[t])
{
dis[v[t]]=dis[u[t]]+w[t];
}
t=next[t];
}
for(int i=n/2;i>=1;i--)
{
siftdown(i);
}
}
for(int i=1;i<=k;i++)
{
printf("%d ",dis[i]);
}
return 0;

}


无需赘语,需要注意的要点和邻接矩阵的堆优化dijstra算法是一样的,我们都必须小心再松弛操作完了之后,对堆进行一次重新调整

好的,以下是使用邻接表方式实现Dijkstra单源最短路径算法的Python代码: ```python import heapq # 无穷大表示两个节点不连通 INF = float("inf") def dijkstra(graph, start): """ 使用Dijkstra算法计算图中start节点到其他节点的最短路径 :param graph: 邻接表表示的图 :param start: 起始节点 :return: 起始节点到各个节点的最短路径长度 """ # 初始化距离为无穷大 dist = {node: INF for node in graph} # 起始节点到自身的距离为0 dist[start] = 0 # 使用优化,使得每次取出距离最小的节点 heap = [(0, start)] while heap: # 取出距离最小的节点和距离 (d, node) = heapq.heappop(heap) # 如果当前节点已经处理过,跳过 if d > dist[node]: continue # 遍历当前节点的邻居节点 for neighbor, weight in graph[node].items(): # 计算从起始节点到邻居节点的距离 distance = dist[node] + weight # 如果新的距离比原来的距离小,更新距离 if distance < dist[neighbor]: dist[neighbor] = distance # 将邻居节点加入中 heapq.heappush(heap, (distance, neighbor)) return dist ``` 使用示例: ```python graph = { "A": {"B": 5, "C": 1}, "B": {"A": 5, "C": 2, "D": 1}, "C": {"A": 1, "B": 2, "D": 4, "E": 8}, "D": {"B": 1, "C": 4, "E": 3, "F": 6}, "E": {"C": 8, "D": 3}, "F": {"D": 6} } print(dijkstra(graph, "A")) ``` 输出结果: ``` {'A': 0, 'B': 3, 'C': 1, 'D': 4, 'E': 7, 'F': 10} ``` 其中,字典中的键表示节点,值表示起始节点到该节点的最短路径长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值