迪杰特斯拉算法堆优化
程序员文章站
2022-05-22 11:22:03
...
迪杰特斯拉算法堆优化
#include<bits/stdc++.h>
using namespace std;
/*Dijkstra算法:
*1.初始化dis[start]=0,其他点,dis[]=无穷大;所有点初始化le[]=0
*2.在le[]=0的里面找dis最小的点x,令le[x]=1;
*3.更新x的邻接点y,(x,y)边的权值为W,若dis[y]>dis[x]+z,则dis[y]=dis[x]+z;
*4.重复2,3直到所有点都变为1;
*/
class N{
public:
int x;//可访问的点
int w;//权值
bool operator < (N a) const{
return this->w>a.w;
}
N(int a,int b): x(a),w(b) {
}
N(){
x=0;
w=0;
}
}
};
const long inf=2147483647;
vector<N> vec[100005];//邻接表
int dis[100005];
int n;
int m;
int s;
void dijkstra(int x){
int le[n+1];//确定点是否被访问
priority_queue<N> que;
for(int i=1;i<=n;i++){
dis[i]=inf;
}
memset(le,0,sizeof(le));
que.push(N(x,0));
dis[x]=0;
while(que.empty()==0){
N t=que.top();
que.pop();
if(le[t.x]==1){
continue;
}
le[t.x]=1;
int len=vec[t.x].size();
for(int i=0;i<len;i++){
if(dis[vec[t.x][i].x]>dis[t.x]+vec[t.x][i].w){
dis[vec[t.x][i].x]=dis[t.x]+vec[t.x][i].w;
que.push(N(vec[t.x][i].x,dis[vec[t.x][i].x]));
}
}
}
}
int main()
{
int u,v,w;
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
vec[u].push_back(N(v,w));
//无向图的话加上这个
//vec[v].push_back(N(u,w));
}
dijkstra(s);
for(int i=1;i<=n;i++)
{
cout<<dis[i]<<" ";
}
}
上一篇: Drools的Java入门Demo
下一篇: 线程的同步与互斥
推荐阅读
-
Java 迪杰斯特拉算法实现查找最短距离的实现
-
基于Python实现迪杰斯特拉和弗洛伊德算法
-
迪杰斯特拉(Dijkstra)算法(Python)
-
js图数据结构处理 迪杰斯特拉算法代码实例
-
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
-
图的五种求最短路径算法(Dijkstra、堆优化Dijstra、Bellmon-Ford、SPFA、Floyd-Warshall)
-
迪杰斯特拉算法(Dijkstra)
-
Python实现迪杰斯特拉算法并生成最短路径的示例代码
-
邻接矩阵prim:php实现图的邻接矩阵及普里姆(prim算法),弗洛伊德(floyd),迪杰斯特拉(dijkstra)算法
-
13.GIS中Dijkstra(迪杰斯特拉)算法如何实现?(JavaScript版本有向图)