图论基础——最短路基础(基础中的基础啊)
这篇有一些水,主要普通Dijkstra,及朴素迪克斯特拉算法,简称普迪。迪克斯特拉算法是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。在图论中称作最短路。
普迪的思路是:有两个数组,d[]和s[]。d数组表示从起点到终点的最小数值。s数组表示当前位置有没有确定,在100%确定当前位置的值为最小值时,s[i]为true,在还有可能要进行改变时,s[i]为false。
最短路是基于图的,关于图的存储,在最短路问题中,大部分图是稠密图,所以用邻接矩阵存储比较好。邻接矩阵用g[][]表示,g[i][j]表示从i到j有一条边,权值为g[i][j]。
普迪是非常简单的,它一般有三个步骤:
(第一部分)第一个步骤是赋初值,这个操作看起来很普通,甚至不配被单独列出来,但是这是不可或缺的,没有这一步,就没法进行接下来的操作,因为要求最小值,所以要把s数组和g数组赋值为INF(极大值),建议是0x3f3f3f3f(memset方便),记得把d[1]=0,否则无法开始。
(第二部分)开始遍历,i从1到n
第二步是第二层循环,j从1到n,寻找一个t,t为一个还未确定的点,且d[t]>d[j]。t一开始为-1,后来满足条件就更新,每一次更新t,都要s[t]=1,因为这表示t已经确定了。
第三步是另一个第二层循环,j从1到n,每次寻找最小的d[j],体现为d[j]=min(d[j],d[t]+g[t][j]),即从当前和改变后取一个最小值。
最后输出d[n]即可,但有一点要注意,有的题的数据有可能很奇特,从起点是到不了终点的,一般会让你输出-1,这个是不能忘的,从起点是到不了终点的情况当且仅当d[n]==0x3f3f3f3f(d[n]为初始值)。