7 9 旅遊規劃

2021-09-05 19:44:54 字數 1808 閱讀 6429

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

輸入說明:輸入資料的第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演算法問題,只不過在建立的圖中,每條邊有兩個權重,乙個是公路的長度,乙個是收費額,當從源點s到某一點w有若干條等長的最短路徑時,選擇收費額最短的那一條;這意味著我們在每個結點更新最短路徑的時候也要更新收費額;此外,若有等長路徑時還要比較收費額,若更少,則要更新最短路徑及收費額。

具體**實現為:

#include#include#define maxvertexnum 505  //最大頂點數設為100

#define infinity 65535 //∞設為雙位元組無符號整數的最大值65535

typedef int vertex; //用頂點下標表示頂點,為整型

typedef int weighttype; //邊的權值設為整型

typedef int costtype; //邊的權值設為整型

/*邊的定義*/

typedef struct enode *ptrtoenode;

struct enode;

typedef ptrtoenode edge;

/*圖結點的定義*/

typedef struct gnode *ptrtognode;

struct gnode;

typedef ptrtognode mgraph; //以鄰接矩陣儲存的圖型別

#define true 1

#define false 0

int s,d; //源點,終點

mgraph buildgraph();

void dijkstra( mgraph graph, vertex s );

int main()

mgraph creategraph(int vertexnum) }

return graph;

} void insertedge(mgraph graph,edge e)

mgraph buildgraph()

} return graph;

}/* 鄰接矩陣儲存 - 有權圖的單源最短路演算法 */

#define error -1

vertex findmindist( mgraph graph, int dist, int collected )

/* 先將起點收入集合 */

dist[s] = 0;

collected[s] = true;

while (1) else if(dist[v]+graph->g1[v][w] == dist[w])}}

}printf("%d %d\n",dist[d],cost[d]);

}

7 9 旅遊規劃

輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 500 是城市的個數,順便假設城市的編號為0 n 1 m是高速公路的條數 s是出發地的城市編號 d是目的地的城市編號。隨後的 m行中,每行給出一條高速公路的資訊,分別是 城市1 城市2 高速公路長度 收費額,中間用空格分開,數字...

7 9 旅遊規劃 (25 分)

題目鏈結 這個題跟個板題差不多,跌死啦演算法,暑假第一周學過,當時學的挺明白的,現在就都忘了,又重新看了看網課,不錯,稍微看一點就行了,dij用來計算兩個點的最短路徑,就是不斷找最短的路,然後一次次的更新就行了。哎 怎麼都忘了 這個題我弄了個結構體就來存路長和過路費,然後跟板子一樣。還有今天大學的運...

7 9 旅遊規劃 (25 分)

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