包含dijkstra可視化java的詞條

  • 1、求大佬用java幫我實現dijkstra算法,單源最短路徑
  • 2、矩陣怎麼用來計算dijkstra算法 java
  • 3、速求java 設計一個程序,用Dijkstra算法實現最短路問題,要用圖形用戶界面體現出來,動態靜態都行
  • 4、跪求解釋java中shortestpath.DijkstraDistance的具體用法????
  • 5、一個有關於java的算法問題,求高手協做

import heapq

from collections import defaultdict

edges = [[“A”,”B”],[“A”,”D”],[“A”,”E”],[“B”,”C”],[“C”,”E”],[“D”,”E”],[“D”,”C”]]

dist = [10,30,100,50,10,60,20]

res = []

def dijkstra(e,dist,start,end):

  hm = defaultdict(list)

  for i in range(len(e)):

    hm[e[i][0]].append((e[i][1],dist[i]))

  r = {}

  r = 0

  q = [(0,start,)]

  while q:

    dis,node,res = heapq.heappop(q)

    if node == end:

      return dis,res

    for u,v in hm[node]:

      t = dis+v

      if u not in r or t r[u]:

        r[u] = t

        heapq.heappush(q,(t,u,res+[u]))

  return 0,[]

dijkstra(edges,dist,”A”,”E”)

怎樣用matlab編程實現Dijkstra算法

%單源點最短路徑Dijkstra算法實現

function [d index1 index2] = Dijkf(a)

% a 表示圖的權值矩陣

% d 表示所求最短路的權和

% index1 表示標號頂點順序

% index2 表示標號頂點索引

%參數初始化

M= max(max(a));

pb(1:length(a))= 0; % 標記向量,表明是否已進入S集合

pb(1)= 1;

index1= 1;

index2= ones(1,length(a));

d(1:length(a))= M; % d矩陣所有元素都初始化為最大權值

d(1)= 0; % 以v1點為源點

temp= 1;

% 更新l(v),同時記錄頂點順序和頂點索引

while sum(pb)length(a) % 重複步驟2,直到滿足停止條件

tb= find(pb==0);

d(tb)= min(d(tb),d(temp)+a(temp,tb)); % 更新l(v)

tmpb= find(d(tb)==min(d(tb))); % 找出min(l(v))

temp= tb(tmpb(1));

pb(temp)= 1;

index1= [index1,temp]; % 記錄標號順序

index= index1(find(d(index1)==d(temp)-a(temp,index1)));

if length(index)=2

index= index(1);

end % if結束

index2(temp)= index; % 記錄標號索引

end % while結束

end

% Dijkf函數結束

巧了,前兩天做課程設計,剛做完,不知道你現在還要嗎,要的話加QQ;272614124

聲明:界面上的路徑是畫出來的,結果是同TextField輸出的

//這個算法用來解決無向圖中任意兩點的最短路徑  

public class ShortestDistanceOfTwoPoint_V5 {  

    public static int dijkstra(int[][] W1, int start, int end) {  

        boolean[] isLabel = new boolean[W1[0].length];// 是否標號  

        int[] indexs = new int[W1[0].length];// 所有標號的點的下標集合,以標號的先後順序進行存儲,實際上是一個以數組表示的棧  

        int i_count = -1;//棧的頂點  

        int[] distance = W1.clone();// v0到各點的最短距離的初始值  

        int index = start;// 從初始點開始  

        int presentShortest = 0;//當前臨時最短距離  

 

        indexs[++i_count] = index;// 把已經標號的下標存入下標集中  

        isLabel[index] = true;  

          

        while (i_countW1[0].length) {  

            // 第一步:標號v0,即w[0][0]找到距離v0最近的點  

 

            int min = Integer.MAX_VALUE;  

            for (int i = 0; i  distance.length; i++) {  

                if (!isLabel[i]  distance[i] != -1  i != index) {  

                    // 如果到這個點有邊,並且沒有被標號  

                    if (distance[i]  min) {  

                        min = distance[i];  

                        index = i;// 把下標改為當前下標  

                    }  

                }  

            }  

            if (index == end) {//已經找到當前點了,就結束程序  

                break;  

            }  

            isLabel[index] = true;//對點進行標號  

            indexs[++i_count] = index;// 把已經標號的下標存入下標集中  

            if (W1[indexs[i_count – 1]][index] == -1 

                    || presentShortest + W1[indexs[i_count – 1]][index]  distance[index]) {  

                // 如果兩個點沒有直接相連,或者兩個點的路徑大於最短路徑  

                presentShortest = distance[index];  

            } else {  

                presentShortest += W1[indexs[i_count – 1]][index];  

            }  

 

            // 第二步:將distance中的距離加入vi  

            for (int i = 0; i  distance.length; i++) {  

                // 如果vi到那個點有邊,則v0到後面點的距離加  

                if (distance[i] == -1  W1[index][i] != -1) {// 如果以前不可達,則現在可達了  

                    distance[i] = presentShortest + W1[index][i];  

                } else if (W1[index][i] != -1 

                         presentShortest + W1[index][i]  distance[i]) {  

                    // 如果以前可達,但現在的路徑比以前更短,則更換成更短的路徑  

                    distance[i] = presentShortest + W1[index][i];  

                }  

 

            }  

        }  

        //如果全部點都遍歷完,則distance中存儲的是開始點到各個點的最短路徑  

        return distance – distance;  

    }  

    public static void main(String[] args) {  

        // 建立一個權值矩陣  

        int[][] W1 = { //測試數據1  

                { 0, 1, 4, -1, -1, -1 },  

                { 1, 0, 2, 7, 5, -1 },  

                { 4, 2, 0, -1, 1, -1 },   

                { -1, 7, -1, 0, 3, 2 },  

                { -1, 5, 1, 3, 0, 6 },   

                { -1, -1, -1, 2, 6, 0 } };  

        int[][] W = { //測試數據2  

                { 0, 1, 3, 4 },  

                { 1, 0, 2, -1 },  

                { 3, 2, 0, 5 },  

                { 4, -1, 5, 0 } };  

 

        System.out.println(dijkstra(W1, 0,4));  

 

    }  

}

//參考別人的,自己就懶得寫了,你拿去參考參考…

import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.List;

import java.util.Map;

import java.util.Set;

public class Dijkstra {

private int[][] graph;// 加權有向圖

private int start;// 源點編號 從 0開始

private int dimention;

static int INF = Integer.MAX_VALUE / 100;

// 用於標記頂點是否已經計算

private SetInteger vertexSet = new HashSetInteger();

// 存儲結果,Map的key對應各終點編號,value對應路徑編號列表。

private MapInteger, ListInteger pathListMap = new HashMapInteger, ListInteger();

public Dijkstra(int[][] graph, int start) {

this.graph = graph;

this.start = start;

this.dimention = graph.length;

calculate();

}

private void calculate() {

// 初始化

for (int end = 0; end dimention; end++) {

if (end == start) {

continue;

}// 起始點自己的路徑排除。

ListInteger pathList = new ArrayListInteger();

pathList.add(start);// 每條路徑的起始點都為start,pathList只記錄編號,不記錄路徑權值

pathList.add(end);// 每條路徑的第二個參數為終點編號

pathListMap.put(end, pathList);

}

// 計算主體

for (int bridge = 0; bridge dimention; bridge++) {

if (bridge == start) {

continue;

}

if (!vertexSet.contains(bridge)) {// 確保每個基點只循環計算一次

for (int next = 0; next dimention; next++) {

if (next == start || next == bridge) {

continue;

}

if (startTo(bridge) + getRawLength(bridge, next) startTo(next)) {

ListInteger pathList = pathListMap.get(next);

ListInteger bridgePathList = pathListMap.get(bridge);

// 清空,使用新的

pathList.clear();

pathList.addAll(bridgePathList);

pathList.add(next);

}

}

}

vertexSet.add(bridge);

}

// 檢查,是否橋接的路徑都被更新

for (int end = 0; end dimention; end++) {

if (end == start) {

continue;

}

ListInteger pathList = pathListMap.get(end);

int size = pathList.size();

if (size 2) {

for (int end2 = 0; end2 dimention; end2++) {

int isEnd = pathList.get(size – 2);

if (end2 == isEnd) {

pathList.clear();

pathList.addAll(pathListMap.get(end2));

pathList.add(end);

}

}

}

}

}

private int startTo(int end) {

int pathLen = 0;

ListInteger pathList = pathListMap.get(end);

for (int i = 0; i pathList.size() – 1; i++) {

pathLen += graph[pathList.get(i)][pathList.get(i + 1)];

}

return pathLen;

}

private int getRawLength(int start, int end) {

if (end == start) {

return 0;

}

return graph;

}

public int getLength(int end) {

if (end == start) {

return 0;

}

return startTo(end);

}

public void printResult() {

System.out.println(pathListMap);

}

public MapInteger, ListInteger getPathListMap() {

return pathListMap;

}

public static void main(String[] args) {

/*

* int [][] graph = { { INF, 10, INF, 30, 100}, { INF, INF, 50, INF,

* INF}, { INF, INF, INF, INF, 10}, { INF, INF, 20, INF, 60}, { INF,

* INF, INF, INF, INF}};

*/

int[][] graph = { { INF, INF, 10, INF, 30, 100 },

{ INF, INF, 5, INF, INF, INF },

{ INF, INF, INF, 50, INF, INF },

{ INF, INF, INF, INF, INF, 10 },

{ INF, INF, INF, 20, INF, 60 },

{ INF, INF, INF, INF, INF, INF }, };

int start = 0;

int end = 0;

int length = graph.length;

for (start = 0; start length; start++) {

System.out.println();

Dijkstra dijkstra = new Dijkstra(graph, start);

dijkstra.printResult();

for (end = 0; end length; end++) {

if (end == start) {

continue;

}

int len = dijkstra.getLength(end);

System.out.println(” Length(” + start + “-” + end + “) = “

+ ((len == INF) ? “Infinity” : len));

}

}

}

}

原創文章,作者:DBNHG,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126793.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DBNHG的頭像DBNHG
上一篇 2024-10-03 23:12
下一篇 2024-10-03 23:13

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論