有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。
輸入格式:
輸入說明:輸入資料的第1行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0~(n−1);m是高速公路的條數;s是出發地的城市編號;d是目的地的城市編號。隨後的m行中,每行給出一條高速公路的資訊,分別是:城市1、城市2、高速公路長度、收費額,中間用空格分開,數字均為整數且不超過500。輸入保證解的存在。
輸出格式:
在一行裡輸出路徑的長度和收費總額,數字間以空格分隔,輸出結尾不能有多餘空格。
輸入樣例:
4 5 0 30 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 個非負整數的給定排列進行增序排...