Dijkstra算法策略为:
设置集合s存放已被访问的顶点,然后执行n次下面两个步骤(n为顶点数):
- 每次从集合v-s中选择与起点s的最短路径最小的一个顶点,访问并加入集合s中
- 之后,令顶点u为中介点,优化起点s与所有从u能到达的顶点v之间的最短路径
具体实现如下:
其中DFS函数用于输出访问的最短路径,其算法与DFS算法一致。
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXV=510; //最大顶点数
const int INF=1000000; //无穷大
struct Node{
int v;
int dis; //v为边的目标顶点,dis为边权
};
int n,m,st,ed; //n为顶点数,图G使用邻接表实现 ,st和ed分别为起点和终点
int d[MAXV],minCost=INF; //起点到达自身的距离为0
int cost[MAXV][MAXV],G[MAXV][MAXV];
vector<int> pre[MAXV]; //前驱
vector<int> tempPath,path; //临时路径,最优路径
bool vis[MAXV]={false};
void Dijkstra(int s){
fill(d,d+MAXV,INF); //fill函数将整个d数组赋为INF
d[s]=0; //u使d[u]最小,min存放该最小的d[u]
for(int i=0;i<n;i++){ //循环n次
int u=