Dijkstra是图论最常用的最短路算法,floyed复杂度是O(n^3),显然是超时的,Bellman-Ford也是超时问题,SPFA更不用说,已经死了 菊花图给你拿捏的死死的
所以万众瞩目的Dijkstra单源最短路径你怎么能不会呢,我也不会
先从未优化的dij开始讲起
大概的思路就是讲=将图上的点分为两类,一类是找到最短路的节点,一类是未找到最短路的节点(建议用一个bool数组就行,不同并查集)
那么讲讲准备,首先未优化的dij是通过;邻接矩阵存储的图,所以我们需要一个数组A[][]表示i和j直接连接的距离,一个path数组记录i的前驱且是最短路径上的前驱)
准备的代码如下
const int inf=999999;
const int maxn=101;
int a[maxn][maxn],d[maxn],path[maxn];
bool f[maxn];
int n,m,start;
main函数其实是存图的过程,简单讲下
对于n个点m条边的图,操作如下
int main(){
cin>>n>>m>>start;
int x,y,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(j==i)a[i][j]=0;
else a[i][j]=inf;
}
for(int i=1;i<=m;i++){
cin>>x>>y>>w;
a[x][y]=w;
a[y][x]=w;
}
Dijkstra(start);
for(int i=1;i<=n;i++){
bfs(i);
cout<<d[i]<<endl;
}
return 0;
}
接下来就是核心—dij了,先初始化然后找起点,跑一遍for更新(d[k]+a[k][j]<d[j])代码如下
void Dijkstra(int s){
for(int i=1;i<=n;i++){
d[i]=inf;
f[i]=false;
}
d[s]=0;
for(int i