單源最短路徑-迪傑斯塔拉(Dijkstra)演算法的實現
/************************************************************************ * * 檔名:7.1.1.cpp * * 檔案描述:Dijkstra演算法的實現(好久沒寫程式碼了,看來我還是適合codeing不適合paper) * * 建立人: fdk * 時 間: 2018-09-03 * * 版本號:1.0 * * 修改記錄: * ************************************************************************/ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #include<limits.h> #define M 100 #define N 100 using namespace std; typedef struct node { int matrix[N][M]; //鄰接矩陣 int n; //頂點數 int e; //邊數 }MGraph; void DijkstraPath(MGraph g, int *dist, int *path, int v0) //v0表示原頂點 { int i, j, k; bool visited[g.n]; for (i = 0; i < g.n; i++) //初始化 { if (g.matrix[v0][i] > 0 && i != v0) { dist[i] = g.matrix[v0][i]; path[i] = v0; //path記錄最短路徑上v0到i的前一個頂點 } else { dist[i] = INT_MAX; //如果i不與v0直接相連,則權值為無窮大 path[i] = -1; } visited[i] = false; //初始化都未被訪問過 } dist[v0] = 0; //初始化最短距離為0 visited[v0] = true; for (i = 0; i < g.n; i++) //迴圈擴充套件n-1次 { int min = INT_MAX; int u; for (j = 0; j < g.n; j++) //尋找未被擴充套件的的權值最小的頂點 { if (visited[j] == false && dist[j] < min) { min = dist[j]; u = j; } } visited[u] = true; /*更新dist陣列的值和路徑的值*/ for (k = 0; k < g.n; k++) { if (visited[k] == false && g.matrix[u][k] > 0 && min + g.matrix[u][k] < dist[k]) { dist[k] = min + g.matrix[u][k]; //如果新加入的結點使得k的結點值變小則更新 path[k] = u; } } } } void showPrint(int *path, int v, int v0) { /*列印時需要從後往前推導,借用堆疊來實現順序輸出*/ stack<int> s; int u = v; while (v != v0) { s.push(v); v = path[v]; } s.push(v); while (!s.empty()) { cout << s.top() << " "; s.pop(); } } int main() { int n, e; //n為頂點數,e為邊數 while (cin >> n >> e && e != 0) { int i, j; int s, t, w; //表示存在一條邊s->t,權值為w MGraph g; int v0; int *dist = new int[n]; //最短距離 int *path = new int[n]; //路徑 for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { g.matrix[i][j] = 0; } } g.n = n; g.e = e; for (i = 0; i < e; i++) { cin >> s >> t >> w; g.matrix[s][t] = w; } cin >> v0; //輸入源頂點 DijkstraPath(g, dist ,path , v0); for (i = 0; i < n; i++) { if (i != v0) { showPrint(path, i, v0); cout << dist[i] << endl; } } } return 0; }
相關推薦
單源最短路徑-迪傑斯塔拉(Dijkstra)演算法的實現
/************************************************************************ * * 檔名:7.1.1.cpp * * 檔案描述:Dijkstra演算法的實現(好久沒寫程式碼了,看來我還是適合codeing
單源最短路徑——迪傑斯特拉(Dijkstra)演算法 C++實現
求最短路徑之Dijkstra演算法 Dijkstra演算法是用來求單源最短路徑問題,即給定圖G和起點s,通過演算法得到s到達其他每個頂點的最短距離。 基本思想:對圖G(V,E)設定集合S,存放已被訪問的頂點,然後每次從集合V-S中選擇與起點s的最短距離最小的一個頂點(記為u),訪問並加入集合
無向圖求最短路徑 迪傑斯特拉(dijkstra)演算法實現
Dijkstra演算法說明 http://ibupu.link/?id=29namespace ConsoleApp14 { class Program { public static int M = -1; static
圖->最短路徑->單源最短路徑(迪傑斯特拉演算法Dijkstra)
文字描述 引言:如下圖一個交通系統,從A城到B城,有些旅客可能關心途中中轉次數最少的路線,有些旅客更關心的是節省交通費用,而對於司機,里程和速度則是更感興趣的資訊。上面這些問題,都可以轉化為求圖中,兩頂點最短帶權路徑的問題。 單源點的最短路徑問題: 給定帶權有向圖G
單源最短路徑-迪傑斯拉特演算法
思路: 在網路中,從某個頂點Vx出發到達另外一個頂點Vi,往往有多條路徑,其中,邊的權值之和最小的路徑稱為最短路徑,並稱Vx為這條最短路徑的源點,Vi為終點。 顯然,邊最少的路徑不一定是最短路徑。 求網路中從指定源點到其餘各頂點的最短路徑的問題,通常稱為單源
迪傑斯特拉(Dijkstra)演算法--有向網路最短路徑
單源最短路徑問題是:對於給定的有向網路G=(V,E)及單個源點v,求v到G的其餘各頂點的最短路徑。 演算法的基本思想 a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其餘頂點},若v與U中頂點u有邊,則<u,v>
迪傑斯特拉(Dijkstra)演算法--無向網路最短路徑
與有向網路不同的是,無向網路的鄰接矩陣是對稱的,所以在構造鄰接矩陣的時候要注意。Dijkstra演算法的具體內容參照我上次寫的迪傑斯特拉(Dijstra)演算法——有向網路最短路徑 下面直接放程式碼和例項,以便更加理解使用。 #include<stdio.
【圖】最短路徑:迪傑斯特拉(Dijkstra)演算法
網圖和非網圖中,最短路徑的含義不同: 非網圖中,因為沒有邊上的權值,最短路徑指的是兩頂點之間經過的邊數最少的路徑; 網圖中,最短路徑指的是兩頂點之間經過的邊上權值之和最少的路徑,並且稱路徑上的第一個
最短路徑問題---迪傑斯特拉(dijkstra)演算法
理解最短路徑——迪傑斯特拉(dijkstra)演算法 1. 迪傑斯特拉演算法簡介 迪傑斯特拉(dijkstra)演算法是典型的用來解決最短路徑的演算法,也是很多教程中的範例,由荷蘭電腦科學家狄克斯特拉於1959年提出,用來求得從起始點到其他所有點最短路徑
迪傑斯特拉(dijkstra)演算法計算兩個地鐵站最短距離
private static HashMap<station> resultMap = new HashMap<>();//結果集 private static List<station> analysisList = new Arra
迪傑斯特拉(Dijkstra)演算法 Java實現
基本思想 通過Dijkstra計算圖G中的最短路徑時,需要指定起點vs(即從頂點vs開始計算)。 此外,引進兩個集合S和U。S的作用是記錄已求出最短路徑的頂點,而U則是記錄還未求出最短路徑的頂點(以及該頂點到起點vs的距離)。 初始時,
數據結構 - 單源最短路徑之迪傑斯特拉(Dijkstra)算法詳解(Java)
previous 代碼 map class matrix () count 就是 可能 給出一個圖,求某個端點(goal)到其余端點或者某個端點的最短路徑,最容易想到的求法是利用DFS,假設求起點到某個端點走過的平均路徑為n條,每個端點的平均鄰接端點為m,那求出這個最短
最短路徑算法——迪傑斯特拉(Dijkstra)
graph 就是 print 偽代碼 c語言程序 距離 oid 很大的 全部 算法思想 設G=(V,E)是一個帶權有向圖 把圖中頂點集合V分成兩組 第一組為已求出最短路徑的頂點集合(用S表示,初始時S中只有一個源點,以後每求得一條最短路徑 , 就將加入到集合S中,直到全部
圖|最短路徑——迪傑斯特拉(Dijkstra)弗洛伊德(Floyd)
最短路徑——迪傑斯特拉(Dijkstra)弗洛伊德(Floyd) 一、迪傑斯特拉演算法(Dijkstra) 1. 問題: 求從每個源點到其餘各頂點的最短路徑。 2.儲存結構: 1)圖的儲存結構: 帶權的鄰接矩陣 2)輔助陣列: 一維陣列dist:dist[ i ]表示
最短路徑迪傑斯特拉演算法和弗洛伊德演算法實現
迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更
最短路徑迪傑斯特拉演算法Python實現
回顧下最短路徑的地傑斯特拉演算法 迪傑斯特拉演算法是求從某一個起點到其餘所有結點的最短路徑,是一對多的對映關係,是一種貪婪演算法 示例: 演算法實現流程思路: 迪傑斯特拉演算法每次只找離起點最近的一個結點,並將之併入已經訪問過結點的集合(以防重複訪問,陷入死迴圈),然後
最短路徑 迪傑斯特拉演算法的簡易實現 大話資料結構 P261改編
對應圖 #include<stdio.h> #define big 65530 #define max 100 int path[max]={0}; int shortpath[max]={0}; typedef struct Node{ c
經典演算法——迪傑斯特拉(Dijkstra)最短路徑
基本思想 迪傑斯特拉演算法是由荷蘭電腦科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從一個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。
資料結構圖之三(最短路徑--迪傑斯特拉演算法)
1 #include <iostream> 2 #include "SeqList.h" 3 #include "Stack.h" 4 #include <iomanip> 5 using namespace std; 6 7 #defin
最短路徑迪傑斯特拉演算法(Dijkstra),用c語言實現
首先,迪傑斯特拉演算法是用來解決單源最短路經問題的,主要是通過邊的鬆弛來實現。 我們來看這個問題: 這個問題求得是從1號頂點到達所有其他頂點的最短距離,我們用鄰接矩陣來儲存這個圖,如下: 我們用一個dis陣列來儲存從一號頂點到其他各個頂點的初始路徑,如圖