最短路之Floyd(弗洛伊德)演算法
弗洛伊德演算法的作用是可以求任意兩點的最短路問題,時間複雜度為O(n^3)。
先舉個栗子:
例如求1->3的最短路徑,首先找出所有可以從1->3的路徑。
1->2+2->3=2+3=5。
1->3=6。
1->4+4->3=4+12=16。
顯然,從1->3的最短路徑為5。
介紹弗洛伊德演算法之前,先說下鬆弛原理和dis[][]陣列
dis[i][j]陣列就是求:從i->j的最短路徑為多少。
鬆弛原理:
三角形兩邊之和大於第三邊。在資訊學中我們叫它三角形不等式。所謂對i,j進行鬆弛操作,就是判斷是否dis[i][j]>dis[i][k]+dis[k][j],如果該式成立則講dis[i][j]減少到dis[i][k]+dis[k][j],否則不動。
好了,下面開始我的表演。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<stdlib.h>
using namespace std;
const int N=1005;
#define INF 0xffffff
int dis[N][N];
int n;
int Floyd(int q,int p)
{
for(int k=1;k<=n;k++)//列舉中間點
{
for(int i=1;i<=n;i++)//列舉起點
{
for(int j=1;j<=n;j++)//列舉終點
{
if(dis[i][j]>dis[i][k]+dis[k][j])//鬆弛原理
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
return dis[q][p];
}
int main()
{
int m;
while (~scanf("%d%d",&n,&m))
{
for(int i=1;i<=n;i++)//初始化
{
for(int j=1;j<=n;j++)
{
if(i==j)dis[i][j]=0;
else
dis[i][j]=INF;
}
}
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
dis[a][b]=dis[b][a]=c;
}
int x1,x2;
scanf("%d%d",&x1,&x2);
int sum=Floyd(x1,x2);//從x1,到x2的最短路徑
if(sum<INF)
printf("%d\n",sum);
else
printf("從%d到%d的道路不通\n",x1,x2);
}
return 0;
}
相關推薦
最短路之Floyd(弗洛伊德)演算法
弗洛伊德演算法的作用是可以求任意兩點的最短路問題,時間複雜度為O(n^3)。 先舉個栗子: 例如求1->3的最短路徑,首先找出所有可以從1->3的路徑。 1->2+2->
資料結構之(圖最短路徑之)Floyd(弗洛伊德)演算法
1)弗洛伊德演算法是求圖最短路徑的另外一種演算法,其適用於求圖中任意兩節點之間最短路徑; 2)其基本思想也是動態規劃,時間複雜度是O(N^3),N代表節點個數; 3)動態規劃的實現步驟是:a)找出問題的最優子結構;b)根據最優子結構求出遞迴解;c)以自下而上的方式求出最優解
最短路徑 單源最短路徑Dijkstra(迪傑斯特拉)演算法 Floyd(弗洛伊德)演算法
兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如 1->3=10 1->2=2 2->3=5 這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到
關於需要記錄路徑的最短路(弗洛伊德)
弗洛伊德用來求單、多源最短路都很常見,然而有些題一定要記錄路徑,很煩,不會的又重新用暴力,爆零也很常見。 真是氣skr人。 其實,時間複雜的確實會比較高,但是也比暴力好,是O(n^3+ n^4)。 首先,還是要走一遍弗洛伊德,記錄最優解。這裡O(n^3);
一本通之信使(弗洛伊德算法)
ffffff () col include %d sin 情況 esp namespace 問題為信使到達所有點用的最小時間。 一個點的所有信使同時出發,這會使一個點產生n種情況,所以我們不能把每一個點拆開看。那我們從整體上看這個題,問的就是從①點到每個點的最小時間中最
函式的魔法 (弗洛伊德查最短路)
連結:https://ac.nowcoder.com/acm/contest/326/C 來源:牛客網 題目描述 一位客人來到了此花亭,給了女服務員柚一個數學問題:我們有兩個函式,F(X)函式可以讓X變成(X*X*X+X*X)mod 233。G(X)函式可以讓X變成(X*X*X
最短路徑(弗洛伊德算法)
creat github lib tab auth logs sca for maxsize 假設條件同上。。 整個算法最核心的,個人覺得就是一個公式: weight[a][b] = min{weight[a][b], weight[a][c]+weight[c][b]}
數據結構(五)圖---最短路徑(弗洛伊德算法)
直接 char getchar 更新 none typedef article truct 使用 一:定義 弗洛伊德算法是用來求所有頂點到所有頂點的時間復雜度。 雖然我們可以直接對每個頂點通過迪傑斯特拉算法求得所有的頂點到所有頂點的時間復雜度,時間復雜度為O(n*3)
最短路徑(鄰接矩陣)(弗洛伊德演算法)
#include<bits/stdc++.h> #define MaxInt 1e8 #define MVNum 100 #define OK 1 #define ERROR 0 using namespace std; typedef int VerTexType; typedef i
Floyd-Warshall(弗洛伊德演算法)
Floyd演算法是用來找出每對頂點之間的最短距離,即適用於多源最短路經,它對圖的要求是,既可以是無向圖也可以是有向圖,邊權可以為負,但是不能存在負環(可根據最小環的正負來判定). 具體可閱讀以下博文: 問題集錦:
【模板】最短路徑(迪傑斯特拉、SPFA、弗洛伊德)
迪傑斯特拉演算法(Dijkstra's Algorithm)解決單源最短路問題的優秀演算法,堆優化後時間複雜度降到O((m+n)logn)。#include<iostream> #include<cmath> #include<cstdio>
最短路徑(弗洛伊德演算法)
1 原理 ,假設存在一個最簡單的連通圖 2 程式碼 package leaning.graph; /* * * 弗洛伊德演算法求最短路徑 * * */ public class Floyd { // 表示V0頂點到v8頂點的最短
Warshall(弗洛伊德演算法)
簡介:Floyd演算法又稱為插點法,是一種利用動態規劃的思想尋找給定的加權圖中多源點之間最短路徑的演算法,與Dijkstra演算法類似。該演算法名稱以創始人之一、1978年圖靈獎獲得者、斯坦福大學計算機科學系教授羅伯特·弗洛伊德命名。eg:暑假,小哼準備去一些城市旅遊
六度分離(弗洛伊德演算法)
六度分離Time Limit : 5000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 29 Accepted Submission(s) : 10
七龍珠 Floyd-Warshall 弗洛伊德演算法
#include <iostream> #include <math.h> #include <algorithm> #include <string.h&g
floydwarshall演算法(弗洛伊德演算法)的理解,就一句話
floydwarshall algorithm(弗洛伊德演算法):對每一個頂點,都要嘗試它作為任一對頂點的中轉頂點的可能性。基於此,形成一個基礎資料庫。在這個基礎資料庫的基礎上,追溯出任意兩點的最短路徑。 對幾個疑問的解釋: 1.簡單的迴圈條件,如for (k=0;k&l
最短路之——弗洛伊德演算法(floyd)
來源: https://blog.csdn.net/riba2534/article/details/54562440我們要做的是求出從某一點到達任意一點的最短距離,我們先用鄰接矩陣來建圖,map[i][j]表示從i點到j點的距離,把自己到自己設為0,把自己到不了的邊初始化為
演算法筆記---最短路路徑之Floyd(弗洛伊德)演算法
最短路路徑之Floyd(弗洛伊德)演算法 Floyd-Wars
演算法:最短路徑之弗洛伊德(Floyd)演算法
#include<iostream>using namespace std;#define MAXEDGE 20#define MAXVEX 20#define INFINITY 65535typedef struct { int vexs[MAXVEX]; int arc[MAX
弗洛伊德(Floyd)演算法求圖的最短路徑
https://blog.csdn.net/jeffleo/article/details/53349825 弗洛伊德基本思想 弗洛伊德演算法作為求最短路徑的經典演算法,其演算法實現相比迪傑斯特拉等演算法是非常優雅的,可讀性和理解都非常好。 基本思想: 弗洛伊德演算法定義了兩個二維