1. 程式人生 > >弗洛伊德演算法求出最短路徑

弗洛伊德演算法求出最短路徑

#include<stdio.h>
#include<stdlib.h>
typedef int Edgetype;//儲存邊的關係 
typedef  char VerType;//定點型別應由使用者定義
#define MAXVER 100
#define INFINITY 66235
typedef struct {
VerType ver[MAXVER];
Edgetype edeget[MAXVER][MAXVER];
int numVertexes,numEdges;//輸入當前的節點數,與邊書 
}MGraph;


MGraph creatGraph();
void MiniSpaTree(MGraph G); 
int find(int parent[],int f);
//void Dijkstra(int p[],int d[],int v0,MGraph G); 
void Floyd_dis(int p[MAXVER][MAXVER],int d[MAXVER][MAXVER],MGraph G);
void show(int p[MAXVER][MAXVER],int d[MAXVER][MAXVER],MGraph G,int v0,int v1);
int main(){
MGraph G = creatGraph();
int p[MAXVER][MAXVER],d[MAXVER][MAXVER],v0 = 0;
Floyd_dis(p,d,G);
//printf("%d",d[2]);
show(p,d,G,0,3);
return 0;

MGraph creatGraph()
{
int i,j,k,w;
MGraph G;
printf("請輸入節點總數,與邊的總數");
scanf("%d%d",&G.numVertexes,&G.numEdges);
getchar();
for(i=0;i<G.numVertexes;i++)
{
printf("請輸入第%d個節點的資料",i+1);
scanf("%c",&G.ver[i]);
//printf("%c",G.ver[i]); 
getchar();
}

//設定個邊的關係
for(i=0;i<G.numEdges;i++)
{
for(j=0;j<G.numEdges;j++)
{
if(i==j)
G.edeget[i][j]=0;
else
G.edeget[i][j] = INFINITY;

}
//printf("dafg");
for(k=0;k<G.numEdges;k++)
{
printf("請輸入vi,vj邊上的序號:");
scanf("%d%d",&i,&j);
printf("請輸入權值"); 
scanf("%d",&w);
G.edeget[i][j]= w;
G.edeget[j][i] = w;
}
return G; 
}
/*
根據弗洛伊德演算法求最短路徑,、
思路: 相當於一五邊形分割成了多個三角形
詳情:http://blog.csdn.net/zhongkeli/article/details/8832946 
定義了兩個二維陣列,p[][]用p來儲存每次改變路徑是的中間點(也就是所謂的前驅矩陣)
d[]是用來儲存當前已經求得某些點的最短距離,所以要利用for語句將所有點都遍歷一到
*/
//---------------------------------------------------------------------
/*
弗洛伊德演算法雖然時間複雜度為n^3,但是它可以一次性將 搞出所有點到其他任意一點的最短距離 
優雅而又簡潔 
*/ 
void Floyd_dis(int p[MAXVER][MAXVER],int d[MAXVER][MAXVER],MGraph G)
{
for(int i=0;i<G.numVertexes;i++)//初始化p,d 
{
for(int j=0;j<G.numVertexes;j++)
{
d[i][j] = G.edeget[i][j];
p[i][j] = j;
}

for(int i=0;i<G.numVertexes;i++)//作為傳說中的中間點 
{
for(int j=0;j<G.numVertexes;j++)
{
for(int k=0;k<G.numVertexes;k++)
{
if(d[j][k] > (d[j][i]+d[i][k]))//有點像向量的加減
{
d[j][k] = d[j][i]+d[i][k];
//因為最後還是要遍歷d[k][j]的所以無需管d[k][j]
p[j][k] = P[j][i];  //p[j][k]代表的是前驅
//因為j-k的路徑不一定是直接存在的也可能用通過j的前驅找出來的
//所以p[j][k]不能存點的中間點的位置,而是應該存的是到中間的前驅
 

}
}
}
}
void show(int p[MAXVER][MAXVER],int d[MAXVER][MAXVER],MGraph G,int v0,int v1)
{
char c= G.ver[v0];
//printf("%c ->",c);
int k = v0; 
printf("The shortest distance = %d\n",d[v0][v1]);

//printf("%c ->",c);
while(k!=v1)
{
printf("%c ->",c);
k = p[k][v1];
//printf("%d",k); 
c = G.ver[k];

printf("%c",c) ;

}

測試資料:0 1 1 1 3 7 3 6 3 6 8 7 8 7 4 7 5 5 5 2 7 2 0 5 1 2 3 6 7 2 3 4 2 6 4 6 7 4 9 5 4 3 2 4 1

相關推薦

演算法路徑

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

【原創】路徑-演算法

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

Floyd小環

lse urn view ide 不存在 eps 圖片 none 枚舉 模板: #include<bits/stdc++.h> using namespace std; const int MAXN = 110; const int IN

路徑-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(

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

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

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

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

演算法筆記---短路路徑之Floyd()演算法

                                                                     最短路路徑之Floyd(弗洛伊德)演算法 Floyd-Wars

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

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

路徑(演算法)

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

路徑演算法C語言實現__Floyd

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

路徑演算法

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演算法是一個經典的動態規劃演算法;首先我

圖的路徑之迪傑斯特拉演算法演算法

一、迪傑斯特拉(Dijkstra)演算法 1、定義描述   Dijkstra(迪傑斯特拉)演算法是典型的單源最短路徑演算法,用於計算一個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。Dijkstra演算法的時

floyd()演算法,用於計算路徑

程式小白,希望和大家多交流,共同學習 //弗洛伊德(floyd)演算法,用於計算最短路徑 #include<iostream> #include<string> #include<iostream> #include<