一、问题分析
(1)带权图(2)给定一个顶点(3)
计算该顶点到各个顶点的最短路径长度:注意这句话。
二、算法设计
(1)假定原点 u ;(2)对顶点划分,分为两个集合:集合S(存放已经确定最短路径的顶点)和集合V--S(存放还未确定最短路径的长度);(3)dist[ ]:记录当前每个顶点所对应的最短特殊路径长度;(4)带权临阶矩阵map[ ][ ], 先把这个数组的值全部赋值为无穷大,然后接收值,如果有边就赋值为改边的值;(5)p[i]:来记录最短路径上i顶点的前驱
三、算法步骤
四、图解
五、代码
写了代码注释很长时间,一不小心删了。。。我想死
#include<cstdio> #include<iostream> #include<cstring> #include<windows.h> #include<stack> using namespace std; const int N=100; const int INF=1e7; int map[N][N]; int dist[N],p[N],n,m; bool flag[N]; void Dijkstra(int u){ for(int i=1;i<=n;i++){ dist[i]= map[u][i]; flag[i]=false; if(dist[i]==INF) p[i]=-1; else p[i]=u; } dist[u]=0; flag[u]=true; for(int i=1;i<=n;i++){ int temp=INF,t=u; for(int j=1;j<=n;j++){ if(!flag[j]&&dist[j]<temp){ t=j; temp=dist[j]; } if(t==u) return; flag[t]=true; for(int j=1;j<=n;j++){ if(!flag[j]&&map[t][j]<INF){ if(dist[j]>(dist[t]+map[t][j])){ dist[j]=dist[t]+map[t][j]; p[j]=t; } } } } } } int main(){ int u,v,w,st; system("color 4A"); cout<<"请输入城市的个数:"; cin>>n; cout<<"请输入城市之间线路的个数:"; cin>>m; cout<<"请输入城市之间的路线以及距离:"<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ map[i][j]=INF; } } while(m--){ cin>>u>>v>>w; map[u][v]=min(map[u][v],w); } cout<<"请输入dgs所在的位置:"; cin>>st; Dijkstra(st); cout<<"dgs所在的位置:"<<st<<endl; for(int i=1;i<=n;i++){ cout<<"dgs:"<<st<<"--"<<"想去的位置:"<<i; if(dist[i]==INF) cout<<"dgs,这里没路,快滚"<<endl; else cout<<"最短距离:"<<dist[i]<<endl; } return 0; }