1. 程式人生 > >【原創】求最短路徑-弗洛伊德演算法

【原創】求最短路徑-弗洛伊德演算法

有這樣一類題,它要求你從某個點出發,到某個為止走過的最短路徑。當然不會有這種題“從A點出發到B點”。一般來講,是這樣的題目“小明從重慶出發到北京,蘭後可以中轉3個城市,每個城市有1個機場或1條公路連結到某些城市,坐車很便宜,坐飛機很貴,求最少花費”,或者“小明從家出發去機場,路上有幾個車站,這些車站某些可以互相同行,車費也不一樣,求最少花費”。

我雖然很不理解這些題目,

你有時間統計每一個城市的每一個車站到的每一輛車的費用和通行的目的地還能把他們裝在平面直角座標系裡用座標表示這些點你沒有時間自己算那條路的費用最少麼還有每條路的錢的差距沒有多大就幾塊錢幾分錢有必要節省麼你有這麼多時間一個一個城市的走一班一班飛機的轉你不能直接直飛嗎你有這麼多時間來旅行嗎你有這麼多時間還不如直接走過去嗎?

但是我還是學習了。

我們一共學習了四種演算法。我先來講講最為暴力實用的Floyed演算法吧。

Floyed演算法很簡單,很暴力,最基本的想法豆是把每兩個點的最短距離都求出來,豆可以了。

怎麼求呢?

假設我們從①點到②點,這兩個點之間有x個點。我們依次列舉這兩個點之間要經過③、④點,看如果從①到②,經過③這個點的距離會不會更短一些,因為我們是從小到大列舉,所以①點、②點到③點的距離(可能)已經求出來了或者根本沒有距離,之後取其中的最小值就可以啦!~\(≧▽≦)/~

當然,因為Floyed很暴力的原因,所以它要花費很多時間,大概是O(n³)這麼多。n是點的個數。

給大家一道例題吧!

題目描述


平面上有n個點(n<=100),每個點的座標均在-10000~10000之間。其中的一些點之間有連線。若有連線,則表示可從一個點到達另一個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。

輸入

第1行:1個整數n
第2..n+1行:每行2個整數x和y,描述了一個點的座標
第n+2行:1個整數m,表示圖中連線的數量
接下來有m行,每行2個整數i和j,表示第i個點和第j個點之間有連線
最後1行:2個整數s和t,分別表示源點和目標點


輸出

第1行:1個浮點數,表示從s到t的最短路徑長度,保留2位小數


樣例輸入

5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5


樣例輸出
3.41

一道模板題,直接上程式碼。

詳見程式碼:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<map>  
#include<vector>  
#include<functional>  
using namespace std;
const int IAmTheBiggestNumber=-10;
//如果你不是Copy的,請看到上一行,請把-10改為很大值!
struct Epic
{
	int x,y;
}point[111];
double dis[111][111];
int n,m,begin,end,a,b;
void init()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d %d",&point[i].x,&point[i].y);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			dis[i][j]=IAmTheBiggestNumber;
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d %d",&a,&b);
		dis[a][b]=dis[b][a]=sqrt(double((point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y)));
	}
	scanf("%d %d",&begin,&end);
}
void search()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
int main()
{
	freopen("floyed.in","r",stdin);
	freopen("floyed.out","w",stdout);
	init();
	search();
	printf("%.2lf\n",dis[begin][end]);
	return 0;
} 

相關推薦

原創路徑-演算法

有這樣一類題,它要求你從某個點出發,到某個為止走過的最短路徑。當然不會有這種題“從A點出發到B點”。一般來講,是這樣的題目“小明從重慶出發到北京,蘭後可以中轉3個城市,每個城市有1個機場或1條公路連

多源路徑演算法(java)不含具體路徑

  Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題。   import java.util.Arrays; public class Florid

路徑(演算法)

1.定義概述 Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。 2.例項演示 /** * 弗洛

路徑演算法C語言實現__Floyd

// 採用鄰接矩陣表示圖 // 簡單起見,鄰接矩陣(圖中各結點間的距離權值)在main函式中直接輸入了 #include <stdio.h> #include <stdlib.h> #define MAXVEX 9 #define INFINIT

路徑長度--簡單易懂

最短路徑 href 弗洛伊德算法 clas 路徑 div bsp -- ref 求任意兩個節點之間的最短路徑長度(只給出路徑長度,不能求出路過的節點): 傻子也能看懂的弗洛伊德算法(轉) 求一個節點到其他節點的最短路徑長度: 傻子也能看懂的迪傑斯特拉算法(轉)【轉】求最短

短路之——演算法(floyd)

來源: https://blog.csdn.net/riba2534/article/details/54562440我們要做的是求出從某一點到達任意一點的最短距離,我們先用鄰接矩陣來建圖,map[i][j]表示從i點到j點的距離,把自己到自己設為0,把自己到不了的邊初始化為

BZOJ4016[FJOI2014]路徑樹問題

register roi cos com static second 點分治 sort std 【BZOJ4016】[FJOI2014]最短路徑樹問題 題面 bzoj 洛谷 題解 雖然調了蠻久,但是思路還是蠻簡單的2333 把最短路徑樹構出來,然後點分治就好啦 ps:如果樹

演算法路徑

#include<stdio.h> #include<stdlib.h> typedef int Edgetype;//儲存邊的關係  typedef  char VerType;//定點型別應由使用者定義 #define MAXVER 100 #d

數據結構—025路徑距離

最短 賦權 oid 數組 動作 info 最終 所有 之前 /*********************************迪傑斯卡特(Dijstra)**************************/ 講解: 1、Dijkstra算法介紹 算法特點: 迪科

路徑-Floyd()演算法

最短路徑-Floyd(弗洛伊德)演算法 簡介: 相較Dijkstra,Floyd是一個完全窮舉圖中每個點到末尾點的最短路徑 演算法思想: 按慣例說兩個工具 Path[MAX_SIZE][MAX_SIZE]:儲存所有的最短路徑(指向

路徑(鄰接矩陣)(演算法

#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演算法解析

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

路徑迪傑斯特拉演算法演算法實現

迪傑斯特拉演算法: 矩陣二位陣列矩陣T儲存頂點vi到各頂點的最短路徑值,初始狀態為鄰接頂點為弧的權值,非鄰接頂點為無窮大。陣列S用於儲存最短路徑,儲存單元為該弧的前驅頂點的下標和與前驅頂點之間的弧的權值。 1.從T中找出一條弧值最小的弧(vi,vj),將該弧加入S中,並根據vj的鄰接點vx更

資料結構篇:校園路徑導航(二:演算法理解與應用)

求最短路徑最常用的有迪傑斯特拉(Dijkstra)和弗洛伊德(Floyd)演算法兩種。本著簡潔為王道的信條,我選擇了Floyd演算法。 Floyd演算法 首先來看一個簡單圖,紅色標記代表在陣列的下標,橙色標記代表距離(邊權值) 我們用D[6][6]這個矩陣儲存兩點之間最短路徑,

演算法-----路徑演算法(一)

學習此演算法的原因:昨天下午遛彎的時候,碰到閨蜜正在看演算法,突然問我會不會弗洛伊德演算法?我就順道答應,然後用了半個小時的時間,學習了此演算法,並用5分鐘講解給她聽,在此也分享給各位需要的朋友,讓你們在最短的時間內,透徹的掌握該演算法。 Robert W. Floyd(

路徑演算法—Floyd()演算法分析與實現(Python)

December 19, 2015 10:56 PM Floyd演算法是解決任意兩點間的最短路徑的一種演算法,可以正確處理帶權有向圖或負權的最短路徑問題 解決此問題有兩種方法: 其一是分別以圖中每個頂點為源點共呼叫n次演算法; 其二是採用Floyd演算法

總結一下路徑演算法(Floyd)

看了好多大牛部落格,我把弗洛伊德演算法在這裡總結一下。 弗洛伊德演算法的介紹,先參考百度百科:Floyd演算法 再來幾篇可以參考的博文:http://www.wutianqi.com/?p=1903 http://www.cnblogs.com/biyeymyhjob/ar

路徑演算法

1 原理 ,假設存在一個最簡單的連通圖 2 程式碼 package leaning.graph; /* * * 弗洛伊德演算法求最短路徑 * * */ public class Floyd { // 表示V0頂點到v8頂點的最短

路徑演算法(3)—Floyd()演算法

Floyd-Warshall演算法,簡稱Floyd演算法,用於求解任意兩點間的最短距離,時間複雜度為O(n^3)。 使用條件&範圍 通常可以在任何圖中使用,包括有向圖、帶負權邊的圖。 Floyd-Warshall 演算法用來找出每對點之間的

路徑演算法—Floyd()演算法

Floyd演算法(解決任意兩點間的最短路徑,可以正確處理有向圖或負權值的最短路徑問題): 時間複雜度O(N3),空間複雜度O(N2); 演算法思想: Floyd演算法是一個經典的動態規劃演算法;首先我