模板如下:
现在我将在代码注释中解释此算法!让我们先从主函数看起
#include<iostream>
#include<queue>
using namespace std;
#define MAXN 2550
#define INF 0x3f3f3f
int n,m,s,d;
int dist[MAXN];//i到j的最短距离
int graph[MAXN][MAXN];
bool vis[MAXN] = {false};
int pre[MAXN];
void DJ(int start)
{
//初始化
for(int i = 1; i <= n; i++)
{
dist[i] = graph[start][i];//这个数组的意思是源点到其他点的距离,这里我们根据与源点邻接来初始化这个数组
pre[i] = start;//我们把他们的前驱结点初始化为源点
}
vis[start] = true;
for(int i = 2; i <= n; i++)//除了源点,还有n-1个点,故找n-1次
{
int MIN = INF,MINID;寻找当前从原点到其余各点距离的最小值,并记录下这个值的点的位置
for(int i = 1; i <= n; i++)//遍历dist数组,找最小值
{
if(!vis[i]&&dist[i]<MIN)
{
MINID = i;
MIN = dist[i];
}
}
vis[MINID] = true;//找到后,标记,这个点就相当于选好了
for(int i = 1; i <= n; i++)//以这个点去开拓新大陆,开始更新路径,如果原路径的长度大于开拓之后的路径,那么我们就更新路径,并把更新掉的路径的前驱结点更新为MINID
{
if(!vis[i] && dist[MINID] + graph[MINID][i] < dist[i])
{
dist[i] = dist[MINID] + graph[MINID][i];
pre[i] = MINID;
}
}
}
}
int main()
{
cin>>n>>m>>s>>d;
//初始化graph
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j) graph[i][j] = 0;//自己到自己必然是0
else graph[i][j] = INF;//到不了的点是无穷大这也没问题吧
}
}
for(int j = 1; j <= m; j++)
{
int x,y,distance;
cin>>x>>y>>distance;
graph[x][y] = distance;//这个地方,你得看明白无向图还是有向图
graph[y][x] = distance;
}
DJ(s);//咱们转移到Dijkstra函数
cout<<dist[d]<<endl;
return 0;
}