【考研】迪杰特斯拉算法

时间复杂度:O(n2)

path[]可以打印出从源点v到任何一个顶点最短路径上所经过的所有点;

path[v]中保存最短路径<u,v>中v的前一个顶点u,每一次更新dist[],都要更新path[]

在考研的dijkstra算法中,只需初始化dist[]、path[]、vis[];

#include<iostream>
using namespace std; 
#define INF 0x3f3f3f3f
#define maxSize 105

typedef struct MGraph { int n,e; int edge[maxSize][maxSize]; }MGraph;
void printfpath(int path[],int a) { int stack[maxSize],top=-1; while(path[a]!=-1) { stack[++top]=a; a=path[a]; } stack[++top]=a;//切记还要加入源点!! while(top!=-1) cout<<stack[top--]<<" "; cout<<endl; }
void dijkstra(MGraph g,int x,int dist[],int path[]) { int vis[maxSize],min,i,j,u; for(i=1;i<=g.n;i++) { dist[i]=g.edge[x][i]; vis[i]=0; if(g.edge[x][i]<INF)path[i]=x; else path[i]=-1; } vis[x]=1;path[x]=-1; for(i=1;i<g.n;i++) { min=INF; //从剩余顶点中选出一个距离x最近的顶点u for(j=1;j<=g.n;j++) if(vis[j]==0&&dist[j]<min) { u=j; min=dist[j]; } //以这个u点作为中介,更新顶点x与剩余顶点的距离 vis[u]=1; for(j=1;j<=g.n;j++) if(vis[j]==0&&dist[j]>dist[u]+g.edge[u][j]) { dist[j]=dist[u]+g.edge[u][j]; path[j]=u; } } }
int main() { int i,j,u,v,w,x,dist[maxSize],path[maxSize]; MGraph g; while(cin>>g.n>>g.e) { for(i=1;i<=g.n;i++) for(j=1;j<=g.n;j++) if(i==j)g.edge[i][j]=0; else g.edge[i][j]=INF; for(i=1;i<=g.e;i++) { scanf("%d%d%d",&u,&v,&w); g.edge[u][v]=w; } cin>>x; dijkstra(g,x,dist,path); for(i=1;i<=g.n;i++) cout<<dist[i]<<" "; } }

转载于:https://www.cnblogs.com/kannyi/p/9401875.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值