Floyd演算法求最短路徑(附程式碼例項)
Floyd演算法
使用範圍:
1)求每對頂點的最短路徑;
2)有向圖、無向圖和混合圖;
演算法思想:
直接在圖的帶權鄰接矩陣中用插入頂點的方法依次遞推地構造出n個矩陣D(1), D(2), …, D(n), D(n)是圖的距離矩陣, 同時引入一個後繼點矩陣記錄兩點間的最短路徑.
演算法步驟:
d(i,j) : i到j的距離;
path(i,j): i到j的路徑上i的後繼點;
輸入帶權鄰接矩陣a(i,j).
1)賦初值
對所有i,j, d(i,j)⬅a(i,j) , path(i,j)⬅j,k=l.
2)更新d(i,j) , path(i,j)
對所有i,j,
d(i,j)⬅d(i,k)+d(k,j) , path(i,j)⬅path(i,k) , k ⬅k+1
3)重複2)直到k=n+1
使用說明:
Floyd演算法程式的使用說明:
1. [D, path]=floyd(a), 返回矩陣D, path 。其中a是所求圖的帶權鄰接矩陣,D(i,j)表示i到j的最短距離; path(i,j)表示i與j之間的最短路徑上頂點i的後繼點.
2. [D, path, min1, path1]= floyd(a,i,j) 返回矩陣D, path; 並返回i與j之間的最短距離min1和最短路徑path1.
MATLAB原始碼:
function [D,path,min1,path1]=floyd(a,start,terminal) D=a;n=size(D,1);path=zeros(n,n); for i=1:n for j=1:n if D(i,j)~=inf path(i,j)=j; end, end, end for k=1:n for i=1:n for j=1:n if D(i,k)+D(k,j)<D(i,j) D(i,j)=D(i,k)+D(k,j); path(i,j)=path(i,k); end, end, end,end if nargin==3 min1=D(start,terminal); m(1)=start; i=1; path1=[ ]; while path(m(i),terminal)~=terminal k=i+1; m(k)=path(m(i),terminal); i=i+1; end m(i+1)=terminal; path1=m; end
示例:
a =[ 0 2 8 1 Inf Inf Inf Inf Inf Inf Inf;
2 0 6 Inf 1 Inf Inf Inf Inf Inf Inf;
8 6 0 7 5 1 2 Inf Inf Inf Inf;
1 Inf 7 0 Inf Inf 9 Inf Inf Inf Inf;
Inf 1 5 Inf 0 3 Inf 2 9 Inf Inf;
Inf Inf 1 Inf 3 0 4 Inf 6 Inf Inf;
Inf Inf 2 9 Inf 4 0 Inf 3 1 Inf;
Inf Inf Inf Inf 2 Inf Inf 0 7 Inf 9;
Inf Inf Inf Inf 9 6 3 7 0 1 2;
Inf Inf Inf Inf Inf Inf 1 Inf 1 0 4;
Inf Inf Inf Inf Inf Inf Inf 9 2 4 0];
start = 1;
terminal = 11;
[D,path,min1,path1]=floyd(a,start,terminal)
結果:
min1 =
13
path1 =
1 2 5 6 3 7 10 9 11
相關推薦
Floyd演算法求最短路徑(附程式碼例項)
Floyd演算法 使用範圍: 1)求每對頂點的最短路徑; 2)有向圖、無向圖和混合圖; 演算法思想: 直接在圖的帶權鄰接矩陣中用插入頂點的方法依次遞推地構造出n個矩陣D(1), D(2), …, D(n), D(n)是圖的距離矩陣, 同時引入一個後繼
資料結構學習之弗洛伊德floyd演算法求最短路徑
#include "stdio.h" #include "stdlib.h" #define MAX 20 #define INFINITY 9999 typedef bool PathMatrix[MAX+1][MAX+1][MAX+1]; typedef int Di
Floyd演算法求最短路徑——Java
前面講述了利用貪心演算法求解最短路徑的兩種演算法,分別是BFS以及Dijkstra演算法。接下來要介紹的這種是一種動態規劃的演算法——弗洛伊德演算法。 用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的角度看問題,我們需要為這個目
pku openjudge 我愛北大 floyd演算法求最短路徑
總時間限制: 1000ms 記憶體限制: 65535kB描述 “紅樓飛雪,一時英傑……”耳邊傳來了那熟悉的歌聲。而這,只怕是我最後一次聽到這個聲音了。 想當年,我們曾經懷著豪情壯志,許下心願,走過靜園,走過一體,走過未名湖畔的每個角落。 想當年,我們也曾慷慨高歌,瞻仰民主與科學,瞻仰博雅塔頂,那百年之前的遺
SPFA演算法求解最短路徑(改進Bellman-ford)
//spfa演算法步驟:https://blog.csdn.net/hehehaha1123/article/details/63250235 import java.util.*; public class SPFA { public static void main(String arg
資料結構-基於鄰接矩陣實現圖的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)
使用 JavaScript 基於鄰接矩陣實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。一、輸入首先,輸入資料主要有兩個,一個是存放節點名的陣列,另一個是存放邊物件的陣列。例如://存放圖結點的陣列 va
資料結構-基於鄰接表實現圖的遍歷視覺化及使用Floyd、Dijkstra演算法求解最短路徑(JavaScript實現)
使用 JavaScript 基於鄰接表實現了圖的深度、廣度遍歷,以及 Floyd、Dijkstra 演算法求解最短路徑。另外使用 SVG 實現圖的遍歷視覺化。<!DOCTYPE html> <html lang="en"> <head>
兩種最短路徑(測地距離)的演算法——Dijkstra和Floyd
從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊上權值之和最小的一條路徑叫做最短路徑。解決最短路的問題有以下演算法,Dijkstra演算法,Bellman-Ford演算法,Floyd演算法和SPFA演算法等。 最短路徑問題是圖論研究中的一個經典演算法問題,旨
Dijkstra演算法求最短路徑問題完整C程式碼
<pre name="code" class="cpp">/* Dijkstra演算法求圖的最短路徑問題C程式碼 */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define Ma
floyd演算法求解最短路徑
轉自 http://blog.csdn.net/zhongkeli/article/details/8832946 這個演算法主要要弄懂三個迴圈的順序關係。 弗洛伊德(Floyd)演算法過程: 1、用D[v][w]記錄每一對頂點的最短距離。 2、依次掃描每一個點
迪傑斯特拉演算法求最短路徑 C++程式碼實現
#include<iostream> #include<string> using namespace std; /*鄰接矩陣的型別定義*/ #define MAX 10000000 #define MAX_VERTEX_NUM 20 typedef
Dijkstra演算法求最短路徑(java)
任務描述:在一個無向圖中,獲取起始節點到所有其他節點的最短路徑描述 Dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。 Dijkstra一般的表述通常有
貪心演算法 迪傑斯特拉演算法求最短路徑
之前我們學習過弗洛伊德演算法求最短路徑,但是使用了三重迴圈,導致時間複雜度是O(n^3),而迪傑斯特拉演算法應該是求最短路徑的最好的演算法了。 迪傑斯特拉演算法原理 迪傑斯特拉演算法實際上是使用貪心演算法和bfs來求最短問題的,它的核心思想是,按照頂點來迭代
Floyd-演算法的最短路徑儲存問題
Floyd 演算法思想和編寫程式碼都比較簡單,不重複,只是我在理解 Floyd 如何儲存找到的各個點之間的最短路勁時候理解了較久時間,做個筆記。 Floyd 演算法模板如下: void floyd(int n, int **map, int **dis ){// n 為節
dijkstra演算法求最短路徑
希望大家能看完prim演算法後再來看這個演算法,因為兩者思路差不多。 先來看一下自定義的結構體 typedef char VexType; typedef int AdjType; typedef struct{ int n; VexTy
隨機生成圖,dijkstra演算法求最短路徑,深度、廣度優先歷遍【待更新其他演算法】
graph_node.h (鄰接連結串列節點類):#pragma once #include "pre_definition.h" //代表邊的節點 class graph_node { int serial_num; int weight;//每條邊的權值 publi
矩陣中從左上角到右下角最短路徑(五種方法)
題目:給定一個n*m的矩陣,矩陣中元素非負,從左上角到右下角找一條路徑,使得路徑上元素之和最小,每次只能向右或者向下走一個方格。如下圖所示:最短路徑是圖中綠色部分的元素。 方法一(轉換為圖中的最短路徑):我們可以把矩陣中的每個方格當做圖中的一個頂點,相鄰的方格之間
PAT A1087 All Roads Lead to Rome(30 分)----最短路徑(加篩選條件)
總結: 1.圖中的點名稱為字母,所以用兩個map來進行轉換 2.先求最短路徑集合,再求符合要求的最短路徑 程式碼: #include<iostream> #include<vector> #include<map> #include<stri
圖之從一個頂點到其餘各個頂點的最短路徑(有向圖)
目錄 從一個頂點到其餘各個頂點最短路徑的簡介 舉例以及詳細分析 程式碼塊 測試結果 從一個頂點到其餘各個頂點最短路徑的簡介(又名單元最短路徑) 1.定義概覽 Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所
怎樣讓一個函式有不定長的引數列表?(附程式碼例項)
一、什麼是可變引數列表? 我相信只要學過C語言,就一定用過 scanf() 和 printf() 兩個標準庫函式。用過的朋友都知道,這兩個函式功能強大無比,能輸入輸出各種各樣型別的東西!