生活随笔
收集整理的這篇文章主要介紹了
数据结构——基于 Dijsktra 算法的最短路径求解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
實驗七 基于 Dijsktra 算法的最短路徑求解 【實驗目的】
掌握圖的鄰接矩陣表示法,掌握采用鄰接矩陣表示法創建圖的算法。 掌握求解最短路徑的 Dijsktra 算法。 【實驗內容】 問題描述 一張地圖包括 n 個城市,假設城市間有 m 條路徑(有向圖),每條路徑的長度 已知。給定地圖的一個起點城市和終點城市,利用 Dijsktra 算法求出起點到終 點之間的最短路徑。 輸入要求 多組數據,每組數據有 m+3 行。第一行為兩個整數 n 和 m,分別代表城市個數 n 和路徑條數 m。第二行有 n 個字符,代表每個城市的名字。第三行到第 m+2 行每 行有兩個字符 a、b 和一個整數 d,代表從城市 a 到城市 b 有一條距離為 d 的路。 最后一行為兩個字符,代表待求最短路徑的城市起點和終點。當 n 和 m 都等于 0 時,輸人結束。 輸出要求 每組數據輸出2行。第1行為一個整數,為從起點到終點之間最短路的長度。 第 2 行為一串字符串,代表該路徑。每兩個字符之間用空格隔開。 輸入樣例 3 3 A B C A B 1 B C 1 C A 3 A C 6 8 A B C D E F A F 100 A E 30 A C 10 B C 5 C D 50 E D 20 E F 60 D F 10 A F 0 0 輸出樣例 2 A B C 60 A E D F 【實驗提示】 此實驗內容即為教材算法 7.15 的擴展,原算法求出源點 v0 到圖中其余所有 頂點的最短路徑。本實驗要求求出一個指定起點到一個指定終點的最短路徑。 為了提高算法的效率,在求解時,可以加以判斷,當已求得的終點為指定終點 時,則可以終止求解,按要求輸出相應結果。
#include <stdio.h>
#include <string.h>
#define INF 32767
#define MAXVEX 30
int dist
[ MAXVEX
] ; int path
[ MAXVEX
] ; int S
[ MAXVEX
] ; typedef char VertexType
; typedef struct graph
{ int n
, e
; VertexType vexs
[ MAXVEX
] ; int edges
[ MAXVEX
] [ MAXVEX
] ;
} MGraph
; void CreateMGraph ( MGraph
& G
, int n
, int e
)
{ int value
; char temp_i
; char temp_j
; G
. n
= n
; G
. e
= e
; for ( int i
= 0 ; i
< n
; i
++ ) { for ( int j
= 0 ; j
< n
; j
++ ) { if ( i
== j
) G
. edges
[ i
] [ j
] = 0 ; else G
. edges
[ i
] [ j
] = 32767 ; } } for ( int j
= 0 ; j
< G
. n
; j
++ ) { getchar ( ) ; scanf ( "%c" , & G
. vexs
[ j
] ) ; } int temp_number_i
; int temp_number_j
; for ( int j
= 0 ; j
< e
; j
++ ) { getchar ( ) ; scanf ( "%c %c %d" , & temp_i
, & temp_j
, & value
) ; for ( int i
= 0 ; i
< n
; i
++ ) { if ( G
. vexs
[ i
] == temp_i
) temp_number_i
= i
; if ( G
. vexs
[ i
] == temp_j
) temp_number_j
= i
; } G
. edges
[ temp_number_i
] [ temp_number_j
] = value
; } } void DispMGraph ( MGraph
& G
)
{ printf ( "輸出頂點信息:\n" ) ; for ( int i
= 0 ; i
< G
. n
; i
++ ) { printf ( "%c" , G
. vexs
[ i
] ) ; } printf ( "\n輸出鄰接矩陣:\n" ) ; printf ( "\t" ) ; for ( int i
= 0 ; i
< G
. n
; i
++ ) printf ( "%8c" , G
. vexs
[ i
] ) ; for ( int i
= 0 ; i
< G
. n
; i
++ ) { printf ( "\n%8c" , G
. vexs
[ i
] ) ; for ( int j
= 0 ; j
< G
. n
; j
++ ) { if ( G
. edges
[ i
] [ j
] == 32767 ) printf ( "%8s" , "∞" ) ; else printf ( "%8d" , G
. edges
[ i
] [ j
] ) ; } printf ( "\n" ) ; }
} void Dijkstra ( MGraph g
, int v
)
{ int mindis
, i
, j
, u
= 0 ; for ( i
= 0 ; i
< g
. n
; i
++ ) { dist
[ i
] = g
. edges
[ v
] [ i
] ; S
[ i
] = 0 ; if ( g
. edges
[ v
] [ i
] < INF
) path
[ i
] = v
; else path
[ i
] = - 1 ; } S
[ v
] = 1 ; for ( i
= 0 ; i
< g
. n
- 1 ; i
++ ) { mindis
= INF
; for ( j
= 0 ; j
< g
. n
; j
++ ) if ( S
[ j
] == 0 && dist
[ j
] < mindis
) { u
= j
; mindis
= dist
[ j
] ; } S
[ u
] = 1 ; for ( j
= 0 ; j
< g
. n
; j
++ ) if ( S
[ j
] == 0 ) if ( g
. edges
[ u
] [ j
] < INF
&& dist
[ u
] + g
. edges
[ u
] [ j
] < dist
[ j
] ) { dist
[ j
] = dist
[ u
] + g
. edges
[ u
] [ j
] ; path
[ j
] = u
; } }
} void Print ( MGraph G
, int v
, int w
)
{ printf ( "\n" ) ; for ( int i
= 0 ; i
< G
. n
; i
++ ) { if ( i
!= v
&& dist
[ i
] != INF
&& i
== w
) { printf ( "%c到%c的最短距離為:%d\n" , G
. vexs
[ v
] , G
. vexs
[ i
] , dist
[ i
] ) ; } else if ( dist
[ i
] == INF
&& i
== w
) { printf ( "%c與%c之間無路徑!\n" , G
. vexs
[ v
] , G
. vexs
[ i
] ) ; } }
} static void Dispath ( MGraph g
, int v
, int w
)
{ int i
, j
, k
; int apath
[ MAXVEX
] , d
; for ( i
= 0 ; i
< g
. n
; i
++ ) { if ( S
[ i
] == 1 && i
!= v
&& i
== w
) { printf ( "%d\n" , dist
[ i
] ) ; d
= 0 ; apath
[ d
] = i
; k
= path
[ i
] ; if ( k
== - 1 ) printf ( "無路徑\n" ) ; else { while ( k
!= v
) { d
++ ; apath
[ d
] = k
; k
= path
[ k
] ; } d
++ ; apath
[ d
] = v
; printf ( "%c " , g
. vexs
[ apath
[ d
] ] ) ; for ( j
= d
- 1 ; j
>= 0 ; j
-- ) printf ( " %c " , g
. vexs
[ apath
[ j
] ] ) ; printf ( "\n" ) ; } } }
} int main ( )
{ MGraph G
; int n
, e
; do { scanf ( "%d%d" , & n
, & e
) ; if ( n
== 0 && n
== 0 ) break ; CreateMGraph ( G
, n
, e
) ; char a
, b
; getchar ( ) ; scanf ( "%c %c" , & a
, & b
) ; int indexa
, indexb
; for ( int i
= 0 ; i
< G
. n
; i
++ ) { if ( a
== G
. vexs
[ i
] ) indexa
= i
; if ( b
== G
. vexs
[ i
] ) indexb
= i
; } Dijkstra ( G
, indexa
) ; Dispath ( G
, indexa
, indexb
) ; } while ( 1 ) ; return 0 ; }
總結
以上是生活随笔 為你收集整理的数据结构——基于 Dijsktra 算法的最短路径求解 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。