dijkstra堆优化
#include <bits/stdc++.h>
#define MOD 10000000007
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int maxn=1000005;
int n,m,s;
//e存终点,w存权值,h存表头,next存下一个点(h和next形成了链表)
int idx,e[maxn],w[maxn],h[maxn],ne[maxn];
int dis[maxn],vis[maxn];//距离,标记
struct Node {
int dis,x;//距离和当前点
//重载运算符(将小于改为大于)
bool operator < (Node p) const {
return dis > p.dis;
}
Node(int dis,int x):dis(dis),x(x) {}
};
//邻接表
void add(int a,int b,int c) {
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
void dijkstra() {
memset(dis,INF,sizeof(dis));//初始化
priority_queue<Node> q;
dis[s]=0;
Node u(dis[s],s);
q.push(u);
while(!q.empty()) {
Node u=q.top ();
q.pop();
if(vis[u.x]) continue;
vis[u.x]=1;
for(int i=h[u.x]; i!=-1; i=ne[i]) {
if(dis[e[i]] > dis[u.x] + w[i]) {
dis[e[i]] = dis[u.x] + w[i];
Node v(dis[e[i]],e[i]);
q.push(v);
}
}
}
}
int main() {
memset(h,-1,sizeof(h));//
cin>>n>>m>>s;
for(int i=1; i<=m; i++) {
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
dijkstra();
for(int i=1; i<=n; i++) {
if(dis[i]==INF) cout<<"2147483647 ";
else cout<<dis[i]<<" ";
}
return 0;
}
...全文
相关推荐
堆优化的dijkstra算法(dijkstra+邻接表+heap)
在处理大规模数据时,原始的Dijkstra算法的时间复杂度较高,通常采用优先队列进行优化,即堆优化的Dijkstra算法。
Dijkstra算法及堆优化
1.有向无环图的单源点最短路 其实跟之前说的最长路是一样的 思路:广搜(拓扑排序)+ DP 如下图所示: 2.一般图的单源点最短路 Dijkstra(迪杰斯特拉)算法 算法思路:每次找离起点最近的那个点,确认它的最短路径值(这个点的最短路必须已经确认了),拿这个点去更新与它相邻的点,不断重复这个操作,从离起点的距离一点一点扩展开,有种贪心+bfs的感觉 举个栗子 说说用Dijkstra求最短路的过程 一开始将所有点到原点的距离设置为正无穷,从1号点出发,更新2号,4号,6号点到原点的距离,dis[2]=
堆优化dijkstra.cpp
堆优化dijkstra算法。使用邻接表。邻接表的应用案例。Dijkstra算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为
堆优化dijkstra代码模板示例
dijkstra时间优化,堆优化,优先队列,最短路算法,O(NlogN)空间时间优化,链式存储,邻接表存图,NOIP,ACM算法竞赛,数据结构
堆优化的Dijkstra算法
打开链接下载源码: https://pan.quark.cn/s/794a17055f6d ### 堆辅助的Dijkstra算法(Dijkstra+邻接表+Heap)#### 算法概述Dijk


