#include <iostream>
#include <queue>
using namespace std;
const int N = 100010;
//first存储距离 second 存储节点
typedef pair<int ,int> PII;
//用邻接表来存储稀疏图
//用优先队列来优化每次找最短的那个节点
int n,m;//n表示节点个数 m表示边的个数
int Head[N],Weight[N],Value[N],Next[N],Index;//数组模拟的邻接表
bool S[N];//是否已经求了最短距离
int Dis[N];//存储最短距离
//邻接表插入边
void Add(int nStart, int nEnd, int nWeight)
{
Weight[Index] = nWeight;
Value[Index] = nEnd;
Next[Index] = Head[nStart];
Head[nStart] = Index;
Index++;
}
void Dijkstra()
{
//初始化Dis数组
fill(Dis,Dis+N,0x3f3f3f3f);
//定义优先队列
priority_queue<PII,vector<PII>,greater<PII> >Heap;
Heap.push(make_pair(0,1));
Dis[1] = 0;
while(Heap.size())
{
int ver = Heap.top().second;
int distance = Heap.top().first;
Heap.pop();
//如果这个点已经被加入到S中
if(S[ver])
{
continue;
}
S[ver] = true;
for(int i = Head[ver]; i != -1; i = Next[i])
{
int j = Value[i];
if(Dis[j] > distance + Weight[i])
{
Dis[j] = distance + Weight[i];
Heap.push(make_pair(Dis[j],j));
}
}
}
}
int main(int argc, char** argv)
{
fill(Head,Head+N,-1);
scanf("%d%d",&n,&m);
while(m--)
{
int nStart,nEnd,nWeight;
scanf("%d%d%d",&nStart,&nEnd,&nWeight);
Add(nStart,nEnd,nWeight);
}
Dijkstra();
for(int i = 1; i <= n; i++)
{
cout<<Dis[i]<<" ";
}
return 0;
}
堆优化的Dijkstra
最新推荐文章于 2023-03-22 16:32:48 发布
本文介绍了一种使用Dijkstra算法求解图中节点间最短路径的方法。通过邻接表存储稀疏图,并利用优先队列优化搜索过程。程序首先初始化最短距离数组,然后在优先队列中按距离升序处理节点,更新相邻节点的最短距离,最终得到所有节点的最短路径。
1680

被折叠的 条评论
为什么被折叠?



