Dijkstra算法的C++、JAVA、Python實現(轉載)

具體講解:留個位置,馬上來

Python實現

轉載至CSDN博主chenxing_的《dijkstra算法python實現》,網址:https://blog.csdn.net/chenxing_/article/details/80904016

MAX_value = 999999
 
 
def dijkstra(graph, s):
    # 判斷圖是否爲空,如果爲空直接退出
    if graph is None:
        return None
    dist = [MAX_value]*len(graph)
    dist[s] = 0
    S = []
    Q = [i for i in range(len(graph))]
    dist_init = [i for i in graph[s]]
    while Q:
        u_dist = min([d for v, d in enumerate(dist_init) if v in Q])
        u = dist_init.index(u_dist)
 
        S.append(u)
        Q.remove(u)
 
        for v, d in enumerate(graph[u]):
            if 0 < d < MAX_value:
                if dist[v] > dist[u]+d:
                    dist[v] = dist[u]+d
                    dist_init[v] = dist[v]
    return dist
 
 
if __name__ == '__main__':
    graph_list = [ [0, 9, MAX_value, MAX_value, MAX_value, 14,15,MAX_value],
                    [9, 0, 24, MAX_value, MAX_value, MAX_value,MAX_value,MAX_value],
                    [MAX_value, 24, 0, 6, 2, 18,MAX_value,19],
                    [MAX_value, MAX_value, 6, 0, 11,MAX_value,MAX_value, 6],
                    [MAX_value,MAX_value, 2, 11, 0, 30,20, 16],
                    [14,MAX_value,18,MAX_value,30,0,5,MAX_value],
                    [15,MAX_value,MAX_value,MAX_value,20,5,0,44],
                    [MAX_value,MAX_value,19,6,16,MAX_value,44,0]]
 
    distance = dijkstra(graph_list, 0)
    print(distance)

JAVA實現

轉載至CSDN博主charilin的《Dijkstra算法的Java實現》,網址:https://blog.csdn.net/weixin_43806015/article/details/84551023

package suanfa;

public class dijkstra {

	public static void main(String[] args) {
      
		char[] vexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
		final int INF = Integer.MAX_VALUE;
		int matrix[][] = {	
				/*A*//*B*//*C*//*D*//*E*//*F*//*G*/
		 /*A*/ {   0,  12, INF, INF, INF,  16,  14},
		 /*B*/ {  12,   0,  10, INF, INF,   7, INF},
		 /*C*/ { INF,  10,   0,   3,   5,   6, INF},
		 /*D*/ { INF, INF,   3,   0,   4, INF, INF},
		 /*E*/ { INF, INF,   5,   4,   0,   2,   8},
		 /*F*/ {  16,   7,   6, INF,   2,   0,   9},
		 /*G*/ {  14, INF, INF, INF,   8,   9,   0}};
		matrixUDG mu = new matrixUDG(vexs, matrix);
		mu.start(3);
		
	}
}

class matrixUDG {
	final int INF = Integer.MAX_VALUE; 
	int numNodes;
	int[][] matrix;
	int[] prev ; 
	int[] dist ; 
	char[] vexs;
	//初始化圖參數
	public  matrixUDG (char[] vexs, int[][] matrix) {
		this.vexs = vexs;
		this.matrix = matrix;
		numNodes = vexs.length;
		prev = new int[numNodes];
		dist = new int[numNodes];
	}
	
	// 核心代碼!!!!
	// 包括三個數組 1.prev(包含當前節點的上一個父類節點) 2.dist(當前節點與原始節點的距離) 
		//					   3.原始矩陣matrix[][],儲存圖           4.isVisited[]標記數組
	public void start(int vs) {
		
		
		//初始化類參數
		boolean[] isVisited = new boolean[numNodes ];
		for (int i = 0; i < isVisited.length; i++) {
			dist[i] = matrix[vs][i];
			prev[i] = -1;
			if(dist[i] != INF) {
				prev[i] = vs;
			}
		}
		isVisited[vs] = true;
		//兩次循環
		for (int i = 0; i < isVisited.length; i++) {
			int min = INF;
			int k = 0;
			//找到最近的節點
			for (int j = 0; j < isVisited.length; j++) {
				if(!isVisited[j] && dist[j] < min ) {
					min = dist[j];
					k = j;
				}
			}
			
			isVisited[k] = true;
			//更新最近路徑和父節點
			for (int j = 0; j < isVisited.length; j++) {
				
				if(!isVisited[j] && matrix[k][j] != INF) {
					if(dist[j] > matrix[k][j] + dist[k]) {
						dist[j] =  matrix[k][j] + dist[k] ;
						prev[j] = k;
					}
					
				}
			}

		
		
		}
		//打印節點、路徑、距離
		for (int i = 0; i < isVisited.length; i++) {
			System.out.print( "節點" + i + "  " );
			int a = i;
			System.out.print("路徑:");
			
			while (a != vs) {
				System.out.print(   prev[a] +"  ");
				a = prev[a];
			}

			System.out.println("距離" + dist[i]);
		}
		
	}
	
}

C++實現

CSDN博主李淡然的《Dijkstra算法(c++版)》,網址:https://blog.csdn.net/qq_39630587/article/details/83240036

#include <iostream>
using namespace std;
void dijkstra();
int e[10][10];
int vis[10];
int dis[10];
int n, m;
int min1 = 99999999;
int u = 0;
int main()
{
    cin >> n >> m;
    // 初始化鄰接表
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (i == j)
            {
                e[i][j] = 0;
            }
            else
            {
                e[i][j] = 99999999;
            }
        }
    }
    // 填充數據
    for (int i = 1; i <= m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        e[a][b] = c;
    }
    for (int i = 1; i <= n; i++)
    {
        dis[i] = e[1][i];
    }
    vis[1] = 1;

    dijkstra();

    for (int i = 1; i <= n; i++)
    {
        cout << dis[i];
    }

    system("pause");
    return 0;
}
void dijkstra()
{
    for (int i = 1; i <= n - 1; i++)
    {
        min1 = 99999999;
        // 尋找權值最小的點u
        for (int j = 1; j <= n; j++)
        {
            if (vis[j] == 0 && dis[j] < min1)
            {
                min1 = dis[j];
                u = j;
            }
        }

        vis[u] = 1;

        for (int v = 1; v <= n; v++)
        {
            // 對於每個u可達的v來說
            if (e[u][v] < 99999999)
            {
                // 如果當前的dis[v]不滿足三角形不等式,那麼進行鬆弛操作
                if (dis[v] > dis[u] + e[u][v])
                {
                    dis[v] = dis[u] + e[u][v];
                }
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章