1. 程式人生 > >每對結點之間最短路徑的C++實現

每對結點之間最短路徑的C++實現

轉載本部落格上原創文章者,請註明出處。

Dijkstra演算法和Bellman-Ford演算法只能計算出起始點到其他各點的最短路徑,但不能計算任意兩隊頂點之間的最短路徑。若真想利用這兩張演算法,可以來一個迴圈,每次讓不同的頂點成為起始頂點,這樣也可以解決,但這種方法效率比較低,所以要想其他方法。

我們可以用最優化的原理來求每對頂點之間的最短路徑,基本思想是:假設圖中有一條從i到j結點的最短路徑,k是圖中的一點,那麼i到j的路徑有可能經過k,也有可能不經過k,因而i到j的最短路徑是這兩種情況中所需權值較小的那條路徑,因而我們可以通過對k的迭代,求出任意一對結點之間的最短路徑。

#include <iostream>
using namespace std;

const int MaxSize=10;

int arr[MaxSize][MaxSize]; //起始的鄰接矩陣
int dist[MaxSize][MaxSize]; //儲存每對結點之間的最短路徑


int numNode=0;

//建立鄰接矩陣
void createArr()
{
	cin>>numNode;
	for(int i=0;i<numNode;++i)
		for(int j=0;j<numNode;++j)
			cin>>arr[i][j];
}


//求出每對結點之間的最短路徑
void allPath()
{
	//初始化dist陣列
	for(int i=0;i<numNode;++i)
		for(int j=0;j<numNode;++j)
			dist[i][j]=arr[i][j];

	//迭代:對於結點k,若i直接到j的距離大於i經過k再到j的距離和時,
	//則改寫i到j的距離
	for(int k=0;k<numNode;++k)
		for(int i=0;i<numNode;++i)
			for(int j=0;j<numNode;++j)
				if(dist[i][k]+dist[k][j]<dist[i][j])
					dist[i][j]=dist[i][k]+dist[k][j];
}


int main()
{
	createArr();

	allPath();
}


相關推薦

結點之間路徑C++實現

轉載本部落格上原創文章者,請註明出處。 Dijkstra演算法和Bellman-Ford演算法只能計算出起始點到其他各點的最短路徑,但不能計算任意兩隊頂點之間的最短路徑。若真想利用這兩張演算法,可以來一個迴圈,每次讓不同的頂點成為起始頂點,這樣也可以解決,但這種方法效率比較

圖演算法---頂點間路徑

3.2、額外空間儲存2*(n*n)def floyd_warshall(W): import copy #需要兩個n*n矩陣的額外儲存 D_in = copy.deepcopy(W) D_ret = copy.deepcopy(W) k = 0 while k

兩點之間路徑:弗洛伊德算法

int code 指定 matrix ++ 計算 之間 logs 執行函數 弗洛伊德算法是計算無向有權圖中兩點間最短路徑的算法,復雜度為O(n^3)。其思路是將兩點間距離分為過(指定的)第三點或是不過,然後取它們的最小值,如此循環就可以得到兩點之間真正的最小值。 void

迪傑斯特拉演算法求路徑 C++程式碼實現

#include<iostream> #include<string> using namespace std; /*鄰接矩陣的型別定義*/ #define MAX 10000000 #define MAX_VERTEX_NUM 20 typedef

資料結構實驗34——求賦權圖中一個結點到所有結點路徑的長度

Description給一個賦權圖(無向圖),求0號結點到其餘所有結點的最短路徑的長度。Input先輸入一個小於等於100的正整數n,然後輸入賦權圖的鄰接矩陣(10000表示無窮大,並且任意一條簡單路徑

單源路徑的思考

前言:         最近一直在看《演算法導論》。演算法這塊難啃的硬骨頭,向來令我頭疼不已,尤其是圖演算法這一部分愈發覺得難啃。在冥思苦想幾日之後雖不能說豁然開朗,但也算是小有斬獲,稍加

spark primer 計算每個每個頂點之間路徑

edge.txt (邊資料) 1 2 2 1 3 5 1 4 1 2 3 2 3 4 2 4 5 3 5 1 2 vertex.txt(頂點資料) 1 2 1 3 1 4 2 3 3 4 4 6 5 1 package m

小生成樹與路徑--C語言實現

的區別 find 延遲 遍歷 最短路徑 標記 += 創建 png 接昨天,在這裏給出圖的其中一種應用:最小生成樹算法(Prime算法和Kruskal算法)。兩種算法的區別就是:Prime算法以頂點為主線,適合用於頂點少,邊密集的圖結構;Kruskal算法以邊為主線,適合於頂

dijkstra演算法(單源路徑) python實現

用例圖: 程式碼1: 用最原始的方式實現dijkstra,就是每次從costs裡面找最短路徑的點,再遍歷這個點的邊,更新最短路徑。由於每次都要從costs裡面找最短路徑,時間複雜讀為O(n^2)。 # dijjkstra演算法(原生最短路徑,還未優化) def dij(start,

SparkGraphX加權路徑演算法實現

版本:Spark 1.6  該版本自帶的最短路徑演算法shortestPaths沒辦法自定義權重(預設每條邊的權重都一樣),不符合現實生活,比如在地圖中計算兩個位置的最短路線,要考慮線路的長度,線路的擁堵情況等多方面,所以寫了個加權最短路徑演算法加入距離屬性 演算法說明:  加權最短路徑演算法計算所有的頂點

結點路徑Floyd弗洛伊德演算法解析

        暑假,小哼準備去一些城市旅遊。有些城市之間有公路,有些城市之間則沒有,如下圖。為了節省經費以及方便計劃旅程,小哼希望在出發之前知道任意兩個城市之前的最短路程。         上圖中有4個城市8條公路,公路上的數字表示這條公路的長短。請注意這些公

Floyd-Warshall 所有結點路徑演算法

以下程式碼僅支援結點是順序的,比如輸入5個結點,結點的編號只能是1到5,輸入順序可以不一致。 動態規劃真的簡潔,三個 for 把這麼複雜的東西就整理好了。 遞推公式:**d[i][j] = min ( d[i][j] , d[i][k] + d[k][j] )

n個節點的完全圖,兩個節點之間路經常為m的路徑

光明小學的小朋友們要舉行一年一度的接力跑大賽了,但是小朋友們卻遇到了一個難題:設計接力跑大賽的線路,你能幫助他們完成這項工作麼? 光明小學可以抽象成一張有N個節點的圖,每兩點間都有一條道路相連。光明小學的每個班都有M個學生,所以你要為他們設計出一條恰好經過M條邊的路徑。 光明

Floyd演算法求解一對頂點之間路徑2

 問題描述:   已知一個各邊權值均大於 0 的帶權有向圖,對每對頂點 vi≠vj,要求求出每一對頂點之間的最短路徑和最短路徑長度。 解決方案: 1.每次以一個頂點為源點,重複執行迪傑斯特拉演算法n次。這樣,便可求得每一對頂點之間的最短路徑。總的執行時間為O(n3)。

一對頂點之間路徑----Floyd演算法----(附完整程式碼)

1.Floyd演算法 2.輸出每兩對頂點之間的最短距離 #include<stdio.h> #include<stdlib.h> #define MaxVertexNum 100 #define INFINITY 65535 //#define MaxSize 1

演算法導論 | 第25章 所有結點路徑問題

零、前言 前面講了單源最短路徑問題,指定一個原點一個終點,找到最短路徑。但是如果我們要求所有結點對呢? 方案一:可以對每一個結點呼叫一次單源最短路徑演算法,一共呼叫|V|次。(每指定一個原點,可以求出其他任何點到該原點的舉例) 對於權值為非負的圖,可以呼叫Dijkstra

結點路徑之Floyd演算法原理詳解及實現

上兩篇部落格介紹了計算單源最短路徑的Bellman-Ford演算法和Dijkstra演算法。Bellman-Ford演算法適用於任何有向圖,即使圖中包含負環路,它還能報告此問題。Dijkstra演算法執行速度比Bellman-Ford演算法要快,但是其要求圖中不能包含負權重

演算法導論之頂點間的路徑

從單源頂點最短路徑到每對頂點間最短路徑,求解的問題從一個點擴充套件到所有點,描述如下:給定一個加權有向圖G=(V,E),其加權函式w:E->R為邊到實數權值的對映,對於每對頂點u,v∈V,找出從u到v的一條最短路徑,其中路徑的權值是指其組成邊的權值之和。可以把單源最短

演算法導論25(所有結點路徑問題)

25.1最短路徑和矩陣乘法 #include<iostream> using namespace std; #define n 20 int L[n][n],M[n][n]; typedef struct { int

有向圖之一對頂點之間路徑

1 上一篇部落格介紹了使用迪傑斯特拉演算法求某個頂點到其他頂點的最短路徑,這一篇介紹使用弗洛伊德(Floyd)演算法求每一對頂點之間的最短路徑,當然也可以使用迪傑斯特演算法來求,求n次就行了。 2 弗洛伊德演算法仍從圖的帶權鄰接矩陣出發,其基本思想是: 2.1 假設求從頂點