对于稠密图来说使用邻接矩阵存储,使用一般的Dijkstra算法
首先初始化二维数组s
memset(s,0x3f,sizeof s);
s初始化为最大值
输入:
a,边的开始位置
b,边的结束位置
c,边的权重
cin>>a>>b>>c;
如果存在自环
if(a==b)的情况,可以直接忽略这一条边,因为Dijkstra考虑正权重,这个时候求最短路
一定是不循环自己更短
如果两个点之间存在多条边,应该只保留最短的一条边
s[a][b]=min(s[a][b],c);
int dijkstra(){
memset(q,0x3f,sizeof q); //q数组是每个点到第一个点的距离,初始化为最大值
q[1]=0; //第一个点到第一个点就是0
for(int i=0;i<n;i++){ //n个点循环n次,要标记n次
int g=-1; //初始化g
for(int j=1;j<=n;j++){ //循环一遍找没有标记过的到起始位置最小的点
if(t[j]==0&&(g==-1||q[g]>q[j])){
g=j; //找到这个点位置
}
}
t[g]=1; //标记它,表示使用过了
for(int j=1;j<=n;j++){
q[j]=min(q[j],q[g]+s[g][j]); //更新最短路
}
}
if(q[n]==0x3f3f3f3f)return -1; //如果最后的点还是最大值,说明没有到达这个点
return q[n]; //如果到达了,就输出最短路
}