Dijkstra算法:
解决带非负权重图的单元最短路径问题。时间复杂度为O(V*V+E)
算法精髓:维持一组节点集合S,从源节点到该集合中的点的最短路径已被找到,算法重复从剩余的节点集V-S中选择最短路径估计最小的节点u,对u的所有连边进行松弛操作。即对j=1~n,dis[j] = min(dis[j],dis[k]+map[k][j])。
常规代码如下:
void Dijkstra() { int i,j,k,mini; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) d[i] = Mod; d[s] = 0; //源点距离为0 for(i=1;i<=n;i++) { mini = Mod; for(j=1;j<=n;j++) //找最短路径估计最小的节点k { if(!vis[j] && d[j] < mini) { k = j; mini = d[j]; } } vis[k] = 1; for(j=1;j<=n;j++) //松弛操作 { if(mp[k][j] != Mod && d[j] > d[k] + mp[k][j]) //mp[k][j] != Mod 也可写成 !vis[j] d[j] = d[k] + mp[k][j]; } } }