Dijkstra算法

来源:互联网 发布:python 牛b 编辑:程序博客网 时间:2024/06/10 09:28

Dijkstra算法

该算法与Prim算法几乎相同,唯一的区别是对于该算法中每个结点key值保存的不是到最小生成树的最短距离,而是到源结点的最短距离,在每找出一个key值最小的源结点后,依次更新该结点的周围结点的key值,这一步在《算法导论》中叫做relax操作,最后得到一个最短路径树,树中所有结点到源结点的路径都是最短的。两重循环,所以复杂度还是O(v^2),代码如下:
package data_structure;//和Prim算法几乎相同public class DijkstraGraph {public int adj[][] = { { 0, 8, 40, 12, 0 }, { 8, 0, 0, 2, 2 },{ 40, 0, 0, 0, 25 }, { 12, 2, 0, 0, 3 }, { 0, 2, 25, 3, 0 }, };public VertexMatrix[] vertex;// 初始化图,值是随便给的,不过邻接矩阵为对称阵public void iniGraph() {vertex = new VertexMatrix[5];for (int i = 0; i < 5; i++) {// 10000为初始的最大值vertex[i] = new VertexMatrix(10000, null, i);}}public int extractMin() {int min = 10000;int id = 0;for (int i = 0; i < vertex.length; i++) {if (vertex[i].inQueue) {if (vertex[i].key < min) {min = vertex[i].key;id = i;}}}return id;}public void dijkstra(int src) {// 设置最短路径树的源结点vertex[src].key = 0;boolean inQueue = true;while (inQueue) {VertexMatrix u = vertex[extractMin()];//u进入最短路径树u.inQueue = false;for (int i = 0; i < 5; i++) {// 更新工作结点的周围结点的标注,即到源结点的距离if (adj[u.id][i] > 0 && vertex[i].inQueue&& vertex[i].key > u.key + adj[u.id][i]) {vertex[i].parent = u;vertex[i].key = u.key + adj[u.id][i];}}inQueue = false;for (int i = 0; i < 5; i++) {inQueue = inQueue || vertex[i].inQueue;}}}public static void main(String[] args) {// TODO Auto-generated method stubDijkstraGraph graph = new DijkstraGraph();graph.iniGraph();graph.dijkstra(1);for (int i = 0; i < 5; i++)System.out.print(graph.vertex[i].key + " ");}}


0 0