时间复杂度: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]<<" "; } }