Dijkstra(G,d[],s){
初始化;
for(循环n次){
u=使d[u]最小的还未被访问的顶点的标号;
记u已被访问;
for(从u出发能到达的所有顶点v){
if(v未被访问&&以u为中介点使s到顶点v的最短距离d[v]更优){
优化d[v];
}
}
}
}
Dijckstra算法伪代码邻接矩阵版:
const int MAXV=1000;
const int INF=1000000000;
int n,G[MAXV][MAXV];
int d[MAXV];
bool visit[MAXV]={false};
void Dijkstra(int s){
fill(d,d+MAXV,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return;
visit[u]=true;
for(int v=0;v<n;v++){
if(visit[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
}
}
}
}
Dijckstra算法伪代码邻接表版:
#include<vector>
using namespace std;
struct Node{
int v,dis;
};
const int MAXV=1000;
const int INF=1000000000;
vector<Node>Adj[MAXV];
int n;
int d[MAXV];
bool visit[MAXV]={false};
void Dijkstra(int s){
fill(d,d+MAXV,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(visit[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return;
visit[u]=true;
for(int j=0;j<Adj[u].size();j++){
int v=Adj[u][j].v;
if(visit[v]==false&&d[u]+Adj[u][j].dis<d[v]){
d[v]=d[u]+Adj[u][j].dis;
}
}
}
}
Dijkstra算法
最新推荐文章于 2024-03-18 16:58:49 发布