迪傑斯特拉演算法

2022-09-20 22:45:09 字數 4141 閱讀 2669

概述

迪傑斯特拉演算法是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有權圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。迪傑斯特拉演算法採用的是貪心策略,將graph中的節點集分為最短路徑計算完成的節點集s和未計算完成的節點集t,每次將從t中挑選v0->vt最小的節點vt加入s,並更新v0經由vt到t中剩餘節點的更短距離,直到t中的節點全部加入s中,它貪心就貪心在每次都選擇乙個距離源點最近的節點加入最短路徑節點集合。迪傑斯特拉演算法只支援非負權圖,它計算的是單源最短路徑,即單個源點到剩餘節點的最短路徑,時間複雜度為o(n²)。

import j**a.util.arraylist;

import j**a.util.list;

/** * @author qxl

* @create 2022-02-12 14:17

*/public class shortestpathdijkstra ;

int v1 = ;

int v2 = ;

int v3 = ;

int v4 = ;

int v5 = ;

int v6 = ;

int v7 = ;

int v8 = ;

matrix[0] = v0;

matrix[1] = v1;

matrix[2] = v2;

matrix[3] = v3;

matrix[4] = v4;

matrix[5] = v5;

matrix[6] = v6;

matrix[7] = v7;

matrix[8] = v8;

vertexes[0] = "v0";

vertexes[1] = "v1";

vertexes[2] = "v2";

vertexes[3] = "v3";

vertexes[4] = "v4";

vertexes[5] = "v5";

vertexes[6] = "v6";

vertexes[7] = "v7";

vertexes[8] = "v8";

}/**

* 建立圖1

*//*

private void creategraph1(int index) ;

int v1 = ;

int v2 = ;

int v3 = ;

int v4 = ;

int v5 = ;

matrix[0] = v0;

matrix[1] = v1;

matrix[2] = v2;

matrix[3] = v3;

matrix[4] = v4;

matrix[5] = v5;

vertexes[0] = "a";

vertexes[1] = "b";

vertexes[2] = "c";

vertexes[3] = "d";

vertexes[4] = "e";

vertexes[5] = "f";

}*//**

* dijkstra最短路徑。

* * vs -- 起始頂點(start vertex) 即,統計圖中"頂點vs"到其它各個頂點的最短路徑。

*/public void dijkstra(int vs)

// 將vs從u中「移除」(u與flag配合使用)

flag[vs] = true;

u[vs] = 0;

// 將vs頂點加入s

s[0] = vertexes[vs];

// 步驟一結束

//步驟四:重複步驟二三,直到遍歷完所有頂點。

// 遍歷vertexes.length-1次;每次找出乙個頂點的最短路徑。

int k = 0;

for (int i = 1; i < vertexes.length; i++)

}//將k放入s中

s[i] = vertexes[k];

//步驟二結束

//步驟三:更新u中的頂點和頂點對應的路徑

//標記"頂點k"為已經獲取到最短路徑(更新u中的頂點,即將k頂點對應的flag標記為true)

flag[k] = true;

//修正當前最短路徑和前驅頂點(更新u中剩餘頂點對應的路徑)

//即,當已經"頂點k的最短路徑"之後,更新"未獲取最短路徑的頂點的最短路徑和前驅頂點"。

for (int j = 0; j < vertexes.length; j++)

}//步驟三結束

}//步驟四結束

// 列印dijkstra最短路徑的結果

system.out.println("起始頂點:" + vertexes[vs]);

for (int i = 0; i < vertexes.length; i++)

for (int x = path.size() - 1; x >= 0; x--) else }}

system.out.println("頂點放入s中的順序:");

for (int i = 0; i < vertexes.length; i++)

}public static void main(string args)

}

import j**a.util.arrays;

/** * @author qxl

* @create 2022-02-12 14:34

*/public class dijkstraalgorithm ;

final int n = 65535;//表示不連通

int matrix = ,,,

,,,};

//建立圖物件,測試 鄰接矩陣

dgraph dgraph = new dgraph(vertex, matrix);

dgraph.showdgraph();

dgraph.djs(6);

dgraph.show();

}}class dgraph

//顯示鄰接矩陣

public void showdgraph()

}//地傑斯特拉演算法

public void djs(int index)

}//更新index下標頂點到周圍頂點的距離和頂點的前驅頂點

public void update(int index)}}

//輸出結果

public void show()

}class visitedvertex

//判斷index下標對應的頂點是否被訪問過,訪問過,返回true,否則返回false

public boolean in(int index)

//更新出發頂點 到 index頂點的距離,dis陣列

public void updatedis(int index, int len)

//更新 pre頂點 的前驅結點為 index對應的結點

public void updatepre(int pre, int index)

//返回出發頂點到index頂點的距離

public int getdis(int index)

//選取下一頂點為新的訪問頂點

public int updatearr()

}already_arr[index] = 1;

return index;

}//顯示最後的結果,將最後的三個陣列的情況輸出

public void show()

system.out.println();

for(int i : pre_visited)

system.out.println();

for(int i : dis)

char vertex = ;

system.out.println();

system.out.println("當前開始為"+vertex[6]);

int count = 0;

for(int i:dis )else

count++;

}system.out.println();

}}

迪傑斯特拉演算法

if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...

迪傑斯特拉演算法

dijkstra 迪傑斯特拉 演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法 能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。dijkstra演算法是很有代表性的最短...

迪傑斯特拉演算法

迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...