Dijkstra 算法
Dijstra(G,d[],s){
初始化;
for(循环n次){
u=使d[u]最小的还未被访问的顶点的标号
记u已被访问
for(从u出发的能到达的所有结点v){
if(v未被访问&&以u为中介点使s到达v的最短距离d[v]更优)
优化d[v];
}
}
}
const int maxn=1000; //最大顶点
const int INF=1000000000;
//-------------------------------------//
//邻接矩阵 适用于V<1000
//时间复杂度 O(V**(V+V))=O(V^2)
int n,G[maxn][maxn];
int d[maxn]; //起点到各点的最短路径
bool vis[maxn]={false};
void Dijkstra(int s){
//慎用memset
fill(d,d+maxn,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
//找不到说明剩下的不连通
if(u==-1) return ;
vis[u]=true;
//优化d[v]
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INFd[u]+G[u][v]<d[u]){
d[v]=d[u]+G[u][v];
}
}
}
}
//-------------------------------------//
//邻接表
//时间复杂度 O(V^2+E)
struct Node{
int v,dis; //v为目标结点,dis为边权
};
vector<Node> Adj[maxn];
int n;
int d[maxn];
bool vis[maxn]={false};
void Dijkstra(int s){
fill(d,d+maxn,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,min=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<min){
u=j;
min=d[j];
}
}
//找不到说明剩下的不连通
if(u==-1) return ;
vis[u]=true;
for(j=0;j<Adj[u].size();j++){
int v=Adj[u][j].v;
if(vis[v]==false&&d[u]+Adj[u][j].dis<d[v]){
d[v]=d[u]+Adj[u][j].dis;
}
}
}
版权声明:本文为larry1648637120原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。