![](https://i-blog.csdnimg.cn/blog_migrate/dbf0045d60f3fd4f42a8d46032f8d962.png)
**dijikstra算法模板
// dijkstra:求最短路
memset(d,0x3f,sizeof(d));
/*
1,d[s]=0;//出发点的路径长度可以确定
2,循环n次,用来确定n个点;
3,求没有确定的值中(集合),最小数的下标mi;
4,确定到该点的路径长度是最短的
5,讨论mi可以去的点中,没有确定的点,有没有更短的路径
*/
d[s]=0;
for(int i=1;i<=n;i++) // n次
{
int mi=-1; // mi对应的点d[]是确定的(f[]=true),所以一开始mi都要设置为-1
//求没有确定的集合中的最小数的下标
for(int j=1;j<=n;j++)
{
if(!f[j]&&(mi==-1||d[j]<d[mi])) // !f[j]限制范围在没有确定的点集合中
{
mi=j;
}
}
// 确定该点的值是最短路径
f[mi]=true;
//从mi点出发,讨论没有确定的点中,是否有更短路
for(int j=1;j<=n;j++)
{
if(!f[j]&&a[mi][j]!=0&&d[mi]+a[mi][j]<d[j])
{
d[j]=d[mi]+a[mi][j];
}
}
}
** 图的最短路 - dijkstra算法
*是典型的单源最短路径算法,主要特点是以起始点为中心向外层层扩展,
直到扩展到终点为止
*如何确定一个点t,从出发点s到该点t的路径长度就是最短的?
在没有确定的点的集合中,找一个最小值!
// 2048 - 最短路径 ---dijkstra算法
// 来源 东方博宜oj oj.czos.cn
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f; //表示无穷大(小于 INT_MAX/2)
const int N=60;
int a[N][N]; //邻接矩阵
int d[N]; //存储从出发点到每个点的最短路径长度,初始值为INF
bool f[N]; //存储哪些点的最短路径已经确定
int n,s;
int main()
{
cin>>n>>s;
//读入邻接矩阵
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cin>>a[i][j];
}
// dijkstra:求最短路
memset(d,0x3f,sizeof(d));
/*
1,d[s]=0;//出发点的路径长度可以确定
2,循环n次,用来确定n个点;
3,求没有确定的值中(集合),最小数的下标mi;
4,确定到该点的路径长度是最短的
5,讨论mi可以去的点中,没有确定的点,有没有更短的路径
*/
d[s]=0;
for(int i=1;i<=n;i++) // n次
{
int mi=-1; // mi对应的点d[]是确定的(f[]=true),所以一开始mi都要设置为-1
//求没有确定的集合中的最小数的下标
for(int j=1;j<=n;j++)
{
if(!f[j]&&(mi==-1||d[j]<d[mi])) // !f[j]限制范围在没有确定的点集合中
{
mi=j;
}
}
// 确定该点的值是最短路径
f[mi]=true;
//从mi点出发,讨论没有确定的点中,是否有更短路
for(int j=1;j<=n;j++)
{
if(!f[j]&&a[mi][j]!=0&&d[mi]+a[mi][j]<d[j])
{
d[j]=d[mi]+a[mi][j];
}
}
}
// 输出s到每个点的路径长度
for(int i=1;i<=n;i++)
{
//如果不是出发点
if(i!=s)
{
if(d[i]!=INF) cout<< d[i]<< " ";
else cout<< -1<< " ";
}
}
return 0;
}