【算法设计与分析】Dijskra算法代码:Java版
生活随笔
收集整理的這篇文章主要介紹了
【算法设计与分析】Dijskra算法代码:Java版
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
import java.util.Arrays;public class DijkstraAlgorithm {public static void main(String[] args) {char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };// 鄰接矩陣int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;// 表示不可以連接matrix[0] = new int[] { N, 5, 7, N, N, N, 2 };matrix[1] = new int[] { 5, N, N, 9, N, N, 3 };matrix[2] = new int[] { 7, N, N, N, 8, N, N };matrix[3] = new int[] { N, 9, N, N, N, 4, N };matrix[4] = new int[] { N, N, 8, N, N, 5, 4 };matrix[5] = new int[] { N, N, N, 4, 5, N, 6 };matrix[6] = new int[] { 2, 3, N, N, 4, 6, N };// 創(chuàng)建 Graph對象Graph graph = new Graph(vertex, matrix);// 測試, 看看圖的鄰接矩陣是否okgraph.showGraph();// 測試迪杰斯特拉算法graph.dsj(2);// C為出發(fā)點(diǎn)// 打印結(jié)果graph.showDijkstra();}
}class Graph {private char[] nodes; // 節(jié)點(diǎn)數(shù)組private int[][] matrix; // 鄰接矩陣private NodesInfo nodesInfo; // 訪問節(jié)點(diǎn)后的記錄信息// 構(gòu)造器public Graph(char[] vertex, int[][] matrix) {this.nodes = vertex;this.matrix = matrix;}// 輸出結(jié)果public void showDijkstra() {nodesInfo.show();}// 輸出圖public void showGraph() {for (int[] link : matrix) {System.out.println(Arrays.toString(link));}}/*** 迪杰斯特拉算法實(shí)現(xiàn)* * @param index 表示出發(fā)節(jié)點(diǎn)對應(yīng)的下標(biāo)*/public void dsj(int index) {nodesInfo = new NodesInfo(nodes.length, index);update(index);// 更新index節(jié)點(diǎn)到周圍節(jié)點(diǎn)的距離、周圍節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)// 訪問其余的vertex.length-1個(gè)節(jié)點(diǎn)for (int j = 1; j < nodes.length; j++) {index = nodesInfo.findNextNode();// 找到一個(gè)[到已經(jīng)訪問過的所有節(jié)點(diǎn)的最近距離最小]的節(jié)點(diǎn)update(index); // 更新index節(jié)點(diǎn)到周圍節(jié)點(diǎn)的距離、周圍節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)}}/*** 更新index下標(biāo)節(jié)點(diǎn)到周圍節(jié)點(diǎn)的距離、周圍節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)* * @param index*/private void update(int index) {int curLen = 0;// 遍歷鄰接矩陣的 matrix[index] 行for (int j = 0; j < matrix[index].length; j++) {// len = 出發(fā)節(jié)點(diǎn)到index節(jié)點(diǎn)的距離 + 從index節(jié)點(diǎn)到j(luò)節(jié)點(diǎn)的距離curLen = nodesInfo.getLenFromBegin(index) + matrix[index][j];// j節(jié)點(diǎn)沒有被訪問過,并且距離出發(fā)點(diǎn)小于表中記錄if (!nodesInfo.hasVisited(j) && curLen < nodesInfo.getLenFromBegin(j)) {nodesInfo.setPreNode(j, index); // 更新j節(jié)點(diǎn)的前驅(qū)為index節(jié)點(diǎn)nodesInfo.setLenFromBegin(j, curLen); // 更新出發(fā)節(jié)點(diǎn)到j(luò)節(jié)點(diǎn)的距離}}}
}// 已訪問節(jié)點(diǎn)集合
class NodesInfo {// 下標(biāo)對應(yīng)節(jié)點(diǎn)是否訪問過: 1=訪問過 0=未訪問public int[] visitedFlag;// 下標(biāo)對應(yīng)節(jié)點(diǎn)的前驅(qū)public int[] preNode;// 記錄出發(fā)節(jié)點(diǎn)到其他所有節(jié)點(diǎn)的距離public int[] lenFromBegin;/*** 構(gòu)造器* * @param length :表示節(jié)點(diǎn)的個(gè)數(shù)* @param index: 出發(fā)節(jié)點(diǎn)。 比如G節(jié)點(diǎn)下標(biāo)是6*/public NodesInfo(int length, int index) {this.visitedFlag = new int[length];this.preNode = new int[length];this.lenFromBegin = new int[length];// 初始化 dis數(shù)組Arrays.fill(lenFromBegin, 65535);this.visitedFlag[index] = 1; // 設(shè)置出發(fā)節(jié)點(diǎn)被訪問過this.lenFromBegin[index] = 0;// 設(shè)置出發(fā)節(jié)點(diǎn)的訪問距離為0}/*** 功能: 判斷index節(jié)點(diǎn)是否被訪問過* * @param index* @return 如果訪問過,就返回true, 否則訪問false*/public boolean hasVisited(int index) {return visitedFlag[index] == 1;}/*** 功能: 更新出發(fā)節(jié)點(diǎn)到index節(jié)點(diǎn)的距離* * @param index* @param len*/public void setLenFromBegin(int index, int len) {lenFromBegin[index] = len;}/*** 功能: 更新pre這個(gè)節(jié)點(diǎn)的前驅(qū)節(jié)點(diǎn)為index節(jié)點(diǎn)* * @param pre* @param index*/public void setPreNode(int pre, int index) {preNode[pre] = index;}/*** 功能:返回出發(fā)節(jié)點(diǎn)到index節(jié)點(diǎn)的距離* * @param index*/public int getLenFromBegin(int index) {return lenFromBegin[index];}/*** 尋找一個(gè)新的距離最短的訪問節(jié)點(diǎn)。這個(gè)節(jié)點(diǎn)的要求是:未訪問過,并且從已訪問節(jié)點(diǎn)到此點(diǎn)是最短路徑。* * @return 新的訪問節(jié)點(diǎn)*/public int findNextNode() {int min = 65535, index = 0;for (int i = 0; i < visitedFlag.length; i++) {// 從所有節(jié)點(diǎn)中尋找if (visitedFlag[i] == 0 && lenFromBegin[i] < min) {// 未訪問過,并且從已訪問節(jié)點(diǎn)到此點(diǎn)是最短路徑min = lenFromBegin[i];index = i;}}// 更新 index 節(jié)點(diǎn)被訪問過visitedFlag[index] = 1;return index;}// 顯示最后的結(jié)果,即:輸出三個(gè)數(shù)組public void show() {System.out.println("==========================");// 輸出already_arrfor (int i : visitedFlag) {System.out.print(i + " ");}System.out.println();// 輸出pre_visitedfor (int i : preNode) {System.out.print(i + " ");}System.out.println();// 輸出disfor (int i : lenFromBegin) {System.out.print(i + " ");}System.out.println();// 為了好看最后的最短距離,我們處理char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };int count = 0;for (int i : lenFromBegin) {if (i != 65535) {System.out.print(vertex[count] + "(" + i + ") ");} else {System.out.println("N ");}count++;}System.out.println();}
}
總結(jié)
以上是生活随笔為你收集整理的【算法设计与分析】Dijskra算法代码:Java版的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【PAT甲级 火星数字】1100 Mar
- 下一篇: 【相对/绝对路径】JavaWeb项目中,