在单源最短路问题中,处理所有边都是正权边情况如果图是稠密图(边很多),那么就会使用朴素的dijkstra算法。时间复杂度是n^2。
这个算法需要关注的地方有两个,分别是存储稠密图的方式和算法的具体实现。
1.稠密图的存储方式,稠密图一般采用邻接矩阵的方式存储(简单点说就是一个二维数组),用一个ab的二元数组来存储a到b的距离。
2.dijkstra算法的实现方法,具体分为定义和两个实现步骤
定义:N:题目给定的数据范围。 bool st【N】存储是否已知到达该位置的最短路。 int dis【N】表示到达该点的距离。
实现1.对于距离的定义,dis【1】定义为0,其余的所有dis均定义为正无穷,可以用0x3f3f3f3f来用一个很大的数来代替正无穷。
实现2.迭代找出当前没有确定最小值中的距离最小值,该最小值确定为以确定最短路径,迭代所有点的由现在最小值得到的新距离。
给出一个具体模板
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=520;
int p[N][N],dis[N],st[N];
int n,m,t;
int dijkstra(){
memset(dis,0x3f,sizeof dis);
dis[1]=0;
for(int i=0;i<n;i++){
t=-1;
for(int j=1;j<=n;j++){
if(!st[j]&&(t==-1||dis[j]<dis[t]))
t=j;
}
st[t]=true;
for(int j=1;j<=n;j++){
dis[j]=min(dis[j],dis[t]+p[t][j]);
}
}
if(dis[n]==0x3f3f3f3f) return -1;
else return dis[n];
}
int main()
{
memset(p,0x3f,sizeof p);
cin >> n >> m;
for(int i=0;i<m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
p[x][y]=min(p[x][y],z);
}
cout << dijkstra();
return 0;
}
2230

被折叠的 条评论
为什么被折叠?



