1. 程式人生 > >資料結構學習之弗洛伊德floyd演算法求最短路徑

資料結構學習之弗洛伊德floyd演算法求最短路徑

#include "stdio.h"
#include "stdlib.h"
#define MAX 20
#define INFINITY 9999

typedef bool PathMatrix[MAX+1][MAX+1][MAX+1];
typedef int DistanceMatrix[MAX+1][MAX+1];

typedef struct  
{
	int vexnum,arcnum;
	char vexs[MAX+1];
	int arcs[MAX+1][MAX+1];
}MGraph;

void CreateDN(MGraph &G)
{
	int i,j,k,v1,v2,w;
	printf("請輸入頂點數和邊數:");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	for(i=0;i<G.vexnum;i++)
	{
		getchar();
		printf("請輸入第%d個結點:",i);
		scanf("%c",&G.vexs[i]);
	}
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
			G.arcs[i][j]=INFINITY;
		for(k=0;k<G.arcnum;k++)
		{
			printf("請輸入邊----源點,終點,權值:");
			scanf("%d %d %d",&v1,&v2,&w);
			G.arcs[v1][v2]=w;
		}
}

void ShortestPath_FLOYD(MGraph G,PathMatrix &P,DistanceMatrix &D)
{
	int v,w,u,i;
	for(v=0;v<G.vexnum;++v)
		for(w=0;w<G.vexnum;++w)
		{
			D[v][w]=G.arcs[v][w];
			for(u=0;u<G.vexnum;++u)
				P[v][w][u]=false;
			if (D[v][w]<INFINITY) 
			{
				P[v][w][v]=true;
				P[v][w][w]=true;
			}
		}
		for(u=0;u<G.vexnum;++u)
			for(v=0;v<G.vexnum;++v)
				for(w=0;w<G.vexnum;++w)
					if (D[v][u]+D[u][w]<D[v][w]) 
					{
						D[v][w]=D[v][u]+D[u][w];
						for(i=0;i<G.vexnum;++i)
							P[v][w][i]=P[v][u][i]||P[u][w][i];
					}
}

void main()
{
	MGraph G;
	int i,j,k;
	CreateDN(G);
	PathMatrix p;
	DistanceMatrix D;
	ShortestPath_FLOYD(G,p,D);
	for(i=0;i<G.vexnum;i++)
		for(j=0;j<G.vexnum;j++)
		{
			printf("%c到頂點%c的最短路徑為:\n",G.vexs[i],G.vexs[j]);
			for(k=0;k<G.vexnum;k++)
				printf("%d ",p[i][j][k]);
			printf("代價為:%d\n",D[i][j]);
			printf("\n");
		}
}
請輸入頂點數和邊數:5 7
請輸入第0個結點:a
請輸入第1個結點:b
請輸入第2個結點:c
請輸入第3個結點:d
請輸入第4個結點:e
請輸入邊----源點,終點,權值:0 1 3
請輸入邊----源點,終點,權值:0 3 8
請輸入邊----源點,終點,權值:1 2 9
請輸入邊----源點,終點,權值:1 3 2
請輸入邊----源點,終點,權值:3 2 5
請輸入邊----源點,終點,權值:3 4 1
請輸入邊----源點,終點,權值:2 4 4
#include<stdlib.h>
#include<stdio.h>
#define INFINITY 1000        // 最大值
#define MAX_VERTEX_NUM   20     // 最大頂點個數
#define TRUE 1
#define FALSE 0 
typedef enum{DG, DN, UDG, UDN} GraphKind;          // 四種圖型別
typedef struct MGraph{
	   char vexs[MAX_VERTEX_NUM];    // 頂點向量
	   int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];    // 鄰接矩陣
	   int vexnum,arcnum;   // 圖的當前頂點數和弧數
	   GraphKind kind;      // 圖的種類標誌
 } MGraph;
void find(int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph G,int a,int b);
void main(){
	MGraph G;
	int D[MAX_VERTEX_NUM][MAX_VERTEX_NUM],P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM];
	int v,w,k,a,b,i;
	printf("請輸入頂點數和弧數");
	scanf("%d %d",&G.vexnum,&G.arcnum);
	G.kind=DG;
	printf("請輸入鄰接矩陣\n");
	for (v = 0; v < G.vexnum; v++)
		for (w = 0; w < G.vexnum; w++) 
			scanf("%d",&G.arcs[v][w]);   //讀入鄰接矩陣
		
		// P[v][w][k]為TRUE,則從v到w的最短路徑中含有k節點
		// D[v][w]從v到w的最短路徑的長度
		for (v = 0; v < G.vexnum; v++)
			for (w = 0; w < G.vexnum; w++){
				D[v][w] = G.arcs[v][w];
				for (k = 0; k < G.vexnum; k++) 
					P[v][w][k] = FALSE;
				if (D[v][w] < INFINITY) 
					P[v][w][v] = P[v][w][w] = TRUE;
			}
			
			for (k = 0; k < G.vexnum; k++) 
				for (v = 0; v < G.vexnum; v++)
					for (w = 0; w < G.vexnum; w++) 
						if (D[v][k] + D[k][w] < D[v][w]){
							D[v][w] = D[v][k] + D[k][w];
							for (i = 0; i < G.vexnum; i++)
								P[v][w][i] = P[v][k][i] || P[k][w][i];
						}
						
						for(a=0; a<G.vexnum; a++)
							for(b=0; b<G.vexnum; b++)
								if(D[a][b] < INFINITY && a!=b){
									printf("%c到%c最短路徑為",65+a,65+b);
									printf("%c\t",65+a);
									find(P,G,a,b);
									printf("%c\t",65+b);
									printf("長度為%d",D[a][b]);
									printf("\n");
								}
}
void find(int P[MAX_VERTEX_NUM][MAX_VERTEX_NUM][MAX_VERTEX_NUM],MGraph G,int a,int b){
	int k;
	for(k = 0; k < G.vexnum; k++)
		if(P[a][b][k]==TRUE && k!=a && k!=b){
			find(P,G,a,k);
			printf("%c\t",65+k);
			find(P,G,k,b);
		}
}

請輸入頂點數和弧數6 9
請輸入鄰接矩陣
0 3 1000 4 1000 5
1000 0 1 1000 1000 5
1000 1000 0 5 1000 1000
1000 3 1000 0 1000 1000
1000 1000
1000 3 0 2
1000 1000 1000 2 1000 0
A到B最短路徑為A B       長度為3
A到C最短路徑為A B       C       長度為4
A到D最短路徑為A D       長度為4
A到F最短路徑為A F       長度為5
B到C最短路徑為B C       長度為1
B到D最短路徑為B C       D       長度為6
B到F最短路徑為B F       長度為5
C到B最短路徑為C D       B       長度為8
C到D最短路徑為C D       長度為5
C到F最短路徑為C D       B       D       B       F       長度為13
D到B最短路徑為D B       長度為3
D到C最短路徑為D B       C       長度為4
D到F最短路徑為D B       F       長度為8
E到B最短路徑為E D       B       長度為6
E到C最短路徑為E D       B       D       B       C       長度為7
E到D最短路徑為E D       長度為3
E到F最短路徑為E F       長度為2
F到B最短路徑為F D       B       長度為5
F到C最短路徑為F D       B       D       B       C       長度為6
F到D最短路徑為F D       長度為2
Press any key to continue

 

相關推薦

資料結構學習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

JS實現路徑(Floyd)算法

arc 技術 func tst rap 分享圖片 char 參考文獻 med 弗洛伊德算法是實現最小生成樹的一個很精妙的算法,也是求所有頂點至所有頂點的最短路徑問題的不二之選。時間復雜度為O(n3),n為頂點數。   精妙之處在於:一個二重初始化,加一個三重循環權值修正,完

(Floyd)演算法求解圖的路徑

弗洛伊德(Froyd)演算法用於求解所有頂點到所有頂點的的最短路徑。時間複雜度為O(n^3). 正如我們所知道的,Floyd演算法用於求最短路徑。Floyd演算法可以說是Warshall演算法的擴充套件,三個for迴圈就可以解決問題,所以它的時間複雜度為O(n^3)。 F

資料結構(圖路徑Floyd演算法

1)弗洛伊德演算法是求圖最短路徑的另外一種演算法,其適用於求圖中任意兩節點之間最短路徑; 2)其基本思想也是動態規劃,時間複雜度是O(N^3),N代表節點個數; 3)動態規劃的實現步驟是:a)找出問題的最優子結構;b)根據最優子結構求出遞迴解;c)以自下而上的方式求出最優解

短路Floyd演算法

弗洛伊德演算法的作用是可以求任意兩點的最短路問題,時間複雜度為O(n^3)。 先舉個栗子: 例如求1->3的最短路徑,首先找出所有可以從1->3的路徑。 1->2+2->

演算法路徑Floyd演算法

#include<iostream>using namespace std;#define MAXEDGE 20#define MAXVEX 20#define INFINITY 65535typedef struct {     int vexs[MAXVEX];     int arc[MAX

路徑演算法(Floyd)

http://blog.csdn.net/ganze_12345/article/details/12164389自己寫的對於這篇文章的改進。怎麼說呢,之前我還認為是因為題目的問題所以要用這種笨方法,可是現在覺得完全是因為自己思維太狹隘了和基本知識的掌握不牢所致,現在通過網

短路——演算法floyd

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

[Python] (Floyd)算法圖的直徑並記錄路徑

百度 elif calculate 元素 program != pat add += 相關概念 對於一個圖G=(V, E),求圖中兩點u, v間最短路徑長度,稱為圖的最短路徑問題。最短路徑中最長的稱為圖的直徑。 其中,求圖中確定的某兩點的最短路徑算法,稱為單源最短路徑

Floyd小環

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

圖|路徑——迪傑斯特拉(Dijkstra)(Floyd)

最短路徑——迪傑斯特拉(Dijkstra)弗洛伊德(Floyd) 一、迪傑斯特拉演算法(Dijkstra) 1. 問題: 求從每個源點到其餘各頂點的最短路徑。 2.儲存結構: 1)圖的儲存結構: 帶權的鄰接矩陣 2)輔助陣列: 一維陣列dist:dist[ i ]表示

路徑 單源路徑Dijkstra(迪傑斯特拉)演算法 Floyd演算法

兩個演算法的主要思想都是鬆弛,就是兩點間的距離通過第三點來變短 比如   1->3=10     1->2=2   2->3=5    這樣你就可以通過2號點把1,3兩點的距離縮短為7 Dijkstra演算法被稱為單源最短路,意思就是隻能計算某個點到

資料結構基礎溫故-5.圖(下):路徑

圖的最重要的應用之一就是在交通運輸和通訊網路中尋找最短路徑。例如在交通網路中經常會遇到這樣的問題:兩地之間是否有公路可通;在有多條公路可通的情況下,哪一條路徑是最短的等等。這就是帶權圖中求最短路徑的問題,此時路徑的長度不再是路徑上邊的數目總和,而是路徑上的邊所帶權值的和。帶權圖分為無向帶權圖和有向帶權圖,但如

拓撲排序以及迪傑斯特拉演算法演算法的一些例子(天勤資料結構

拓撲排序核心演算法     在一個有向圖中找到一個拓撲排序的過程如下:     1)從一個有向圖中選擇一個沒有前驅(入度為0)的頂點輸出;     2)刪除1)中的頂點,並刪除從該頂點出發的全部邊;  

[從今天開始修煉資料結構]圖的路徑 —— 迪傑斯特拉演算法演算法的詳解與Java實現

在網圖和非網圖中,最短路徑的含義不同。非網圖中邊上沒有權值,所謂的最短路徑,其實就是兩頂點之間經過的邊數最少的路徑;而對於網圖來說,最短路徑,是指兩頂點之間經過的邊上權值之和最少的路徑,我們稱路徑上第一個頂點是源點,最後一個頂點是終點。 我們講解兩種求最短路徑的演算法。第一種,從某個源點到其餘各頂點的最短路徑

的人格結構說中潛意識,前意識,意識和自我,本我,超我的區別

運用 潛意識 有時 特性 緩解 正常的 可能 pan 特征   意識是大腦對客觀存在的反應,是個體在任何時刻覺察到的感覺與體驗,既有特性又有共性。   人格是人的性格與氣質,是個體的特性。   意識分為:顯意識、前意識、無意識(=潛意識?=原意識?)。弗洛伊德

數據結構(五)圖---路徑算法)

直接 char getchar 更新 none typedef article truct 使用 一:定義 弗洛伊德算法是用來求所有頂點到所有頂點的時間復雜度。 雖然我們可以直接對每個頂點通過迪傑斯特拉算法求得所有的頂點到所有頂點的時間復雜度,時間復雜度為O(n*3)

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

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

Algorithm學習筆記 --- 大臣的旅費(演算法)

很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。 為節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。 J是T國重

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

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