1. 程式人生 > >Floyd演算法求最短路徑(附程式碼例項)

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,k)+d(k,j)<d(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 Rome30 分----路徑加篩選條件

總結: 1.圖中的點名稱為字母,所以用兩個map來進行轉換 2.先求最短路徑集合,再求符合要求的最短路徑 程式碼: #include<iostream> #include<vector> #include<map> #include<stri

圖之從一個頂點到其餘各個頂點的路徑有向圖

目錄 從一個頂點到其餘各個頂點最短路徑的簡介 舉例以及詳細分析 程式碼塊 測試結果 從一個頂點到其餘各個頂點最短路徑的簡介(又名單元最短路徑) 1.定義概覽 Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所

怎樣讓一個函式有不定長的引數列表?程式碼例項

一、什麼是可變引數列表?        我相信只要學過C語言,就一定用過 scanf() 和 printf() 兩個標準庫函式。用過的朋友都知道,這兩個函式功能強大無比,能輸入輸出各種各樣型別的東西!