一、單源最短路徑問題
(1)求下列多級圖的單源最短路徑,寫出求解過程。
根據cost(i)
=min可知:cost為
1 2
3 4
5 6
7 8
9 10
d為 1
2 34 5
6 78 9
10
p為 1
2 3
4 5
6 7
8 9
10
計算過程如下:
初始:cost[1..n]=0;
cost[9]=min=9; d[9]=10
cost[8]=min=7; d[8]=10
cost[7]=min=17; d[7]=9
cost[6]=min=10; d[6]=8
cost[5]=min=11; d[5]=8
cost[4]=min=17; d[4]=6
cost[3]=min=17; d[3]=5
cost[2]=min=13; d[2]=6
cost[1]=min=16; d[1]=2
最短路徑是16
,即是1→2→6→8→10
(2)任選一種程式語言,編寫程式實現單源最短路徑演算法。
#include
#include
#define x 1000
#define max 1000
int data[10][10];
int dist[10];//記錄最短路徑為多少
int path[10];//記錄最短路徑
int kmin(int,int);
void fpath(int a[10]);
int froute(int a[10]);
void main()
int i,m;
int a[10][10]=,,,
,,,,
,,/*for (i=0;i<10;i++) */
fpath(a);
printf("最短路徑大小為
: %d\n"
,dist[9]);
m=froute(a);
for(i=m-1;i>=0;i--)
printf("最短路徑經過
: %d\n"
,path[i]);
void fpath(int a[10])
int i,j,k;
dist[0]=0;
for(i=1;i<10;i++)
k=max;
for(j=0;jif(a[j][i]!=x)
if((dist[j]+a[j][i])k=dist[j]+a[j][i];
dist[i]=k;
int froute(int a[10])
{ int j,b,k=1,i=9;
path[0]=10;
while(i>0)
{ for(j=i-1;j>=0;j--)
{ if(a[j][i]!=x)
b=dist[i]-a[j][i];
if(b==dist[j])
{ path[k++]=j+1;
i=j;
break;
return k;
單源最短路徑問題
如圖,求v0到其他頂點的最短路徑及其長度,廢話少說,用dijkstra演算法。我在 資料結構 c語言版 裡面的 的基礎上寫了乙個直接儲存路徑的版本。看 include includeusing namespace std define maxint 1000000 src 為源節點 g 有向圖的鄰接...
單源最短路徑問題
給定帶權有向圖g v,e 其中每條邊的權是非負實數。給定v中的乙個頂點,稱為源。現在要計算從源到所有其它各頂點的最短路長度,這裡路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。每條邊上標註有字母和數字,在字母旁邊的數字為路長。演算法從優先佇列中取出具有最小當前路長的結點作為當前擴充套件...
單源最短路徑問題
單源最短路徑問題是這樣乙個問題 在圖中給定乙個起點,求起點到其它頂點的最短距離。dijkstra演算法是用來解決邊權非負的情況的。它的基本思想是設乙個陣列d n 用來代表起點到其它頂點的最短距離。初始的時候d start 為0,其它的d i 設為無窮。然後從起點開始遍歷整個圖,若存在頂點u,使得d ...