单源最短路径。源点到其余各个顶点的最短路径。
例如求1号顶点到其余各点的最短路径,不停更新dis数组即可。
基本思想:
每次找到离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。
/*dis数组初始化*/
void disInit(int sourcePoint,int n,int e[10][10],int dis[10]){
for(int i=1;i<=n;i++) dis[i]=e[sourcePoint][i];
}
/*book数组初始化*/
void bookInit(int sourcePoint, int n,int book[10]){
for(int i=1;i<=n;i++) book[i]=0;
book[sourcePoint]=1;
}
/*Dijkstra 核心代码*/
void Dijkstra(int n,int e[10][10],int dis[10],int book[10]){
int min,i,j,u,v;
for(i=1;i<=n-1;i++){
//找到离SourcePoint号顶点最近的顶点
min = inf;
for(j=1;j<=n;j++){
if(book[j]==0 && dis[j]<min){
min = dis[j];
u=j;
}
}
book[u]=1;
for(v=1;v<=n;v++){
if(e[u][v]<inf){
if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v];
}
}
}
}
算法复杂度: O ( N 2 ) O(N^2) O(N2),此算法不能解决有负权边的图
- 每次找到离 S o u r c e P o i n t SourcePoint SourcePoint最近的顶点的时间复杂度是 O ( N ) O(N) O(N),可以用“堆”来优化至 O ( l o g N ) O(logN) O(logN);
- 对于稀疏图,用邻接矩表可以降到
O
(
(
M
+
N
)
l
o
g
N
)
O((M+N)logN)
O((M+N)logN)
其中 M M M为边数
有错误请不吝赐教!!谢谢:)