//朴素Dijkstra 邻接矩阵存储稠密图
int g[N][N];//g[a][b]:a->b的权重
int dist[N];//dist[i]:起点到i的距离
bool st[N];//st[i]:i点是否已确定最短路
void dijkstra(int u)//u为起点
{
memset(dist,0x3f,sizeof dist);//距离都初始化为很大的数
dist[u]=0;//u->u 距离为0 起点为0
for(int i=0;i<n;i++)//n个点 n次循环
{
int t=-1;//t是距离最近的未确定最短路点的编号
for(int j=1;j<=n;j++)//遍历n个点
if(!st[j] && (t==-1 || dist[t]>dist[j]))//寻找最近的点 //将图视除起点外都是迷雾,这里是确定开迷雾的方向
t=j;
st[j]=true;//找到的点 确定了最短路
for(int j=1;j<=n;j++)//遍历n个点 用最新的点更新迭代所有出边
dist[j]=min(dist[j],dist[t]+g[t][j]);//以原有的基础上进行开迷雾
}
}
朴素dijkstra算法的大体思路,首先就行初始化,进行n-1次迭代,找到集合外距离起点最近的点,让这个点进入集合,然后用这个点去更新其他的点。
bellman-ford算法
为什么最后面会是dist[N]>0x3f3f3f3f/2;而不是dist[N]!=0x3f3f3f3f因为bellman-ford算法进行两重循环,存在dist点没有被更新而边被更新了的情况。