資料結構PTA 案例6 1 5 旅遊規劃

2021-10-08 12:33:07 字數 2348 閱讀 7618

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。

輸入格式:

輸入說明:輸入資料的第1行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0~(n−1);m是高速公路的條數;s是出發地的城市編號;d是目的地的城市編號。隨後的m行中,每行給出一條高速公路的資訊,分別是:城市1、城市2、高速公路長度、收費額,中間用空格分開,數字均為整數且不超過500。輸入保證解的存在。

輸出格式:

在一行裡輸出路徑的長度和收費總額,數字間以空格分隔,輸出結尾不能有多餘空格。

輸入樣例:

4 5 0 3

0 1 1 20

1 3 2 30

0 3 4 10

0 2 2 20

2 3 1 20

輸出樣例:

3 40

思路

這是一道基本的單源最短路徑問題。注意單源最短路徑問題中,源點到某一特定點的最短路徑的時間複雜度源點到所有點的最短路徑的時間複雜度相同

這裡涉及到的操作有:初始化乙個空圖(用鄰接矩陣實現,動態陣列)、插入邊、構建圖,dijkstra演算法。初始化空圖時,權重的資料型別應該是乙個結構體,既能儲存長度距離,又能儲存費用。

在dijkstra演算法中,尋找下一頂點v的時候,仍然按照最小距離尋找,只不過在更新dist、cost、path這三個陣列的時候,需要注意,

距離的優先順序是最高的,如果dist[w]因為新增v變小了,那麼一定要進行更新。

其次是距離相等的時候,cost[w]變小了就更新,否則cost不更新.

注意:對於源點,collected[s]一定要賦值為1,而dist[s]不一定要賦值為0,因為collected[s]=0會導致後面在findmindist函式中也不會用到dist[s]。cost[s]和dist[s]同理

實現

#include

#include

#include

#define infinity 100000

#define error -2

typedef

int vertex;

struct weight

;typedef

struct weight weighttype;

typedef

struct gnode *ptrtognode;

typedef ptrtognode mgraph;

struct gnode

;typedef

struct enode *ptrtoenode;

typedef ptrtoenode edge;

struct enode

;mgraph creategraph

(int vertexnum)

//initial

for(i=

0; inv; i++

)for

(j=0

; jnv; j++

)return graph;

}void

insertedge

(mgraph graph, edge e)

mgraph buildgraph

(int vertexnum,

int edgenum)

return graph;

}vertex findmindist

(mgraph graph,

int dist,

int collected)

}if(mindist == infinity)

return error;

return minv;

}bool dijkstra

(mgraph graph,

int dist,

int path,

int cost[

], vertex s)

// dist[s] = 0;

collected[s]=1

; vertex w;

while(1

)}}}

return true;

}int

main()

PTA 資料結構與演算法 7 9 旅遊規劃

如有不對,不吝賜教 進入正題 有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入格式 輸入說明 輸入資料的第1行給出4個正整數n m...

pta資料結構

是否二叉搜尋樹 這題只要是了解二叉查詢樹的特點。bool isbst bintree t while right1 return isbst t left isbst t right 線性探測法的查詢函式 主要注意雜湊函式,這裡那個常量是真的坑,卡了半天。position find hashtabl...

資料結構PTA 案例7 1 5 與零交換

將 的任意乙個排列進行排序並不困難,這裡加一點難度,要求你只能通過一系列的 swap 0,即將乙個數字與 0 交換 的操作,將初始序列增序排列。例如對於初始序列 我們可以通過下列操作完成排序 swap 0,1 swap 0,3 swap 0,4 本題要求你找出將前 n 個非負整數的給定排列進行增序排...