旅遊規劃(pta c語言)
阿新 • • 發佈:2018-12-09
有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫一個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。
輸入格式:
輸入說明:輸入資料的第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
用floyd演算法可以直接得到各點間的最短路徑,關鍵點在於如何選擇在具有多條最短路徑時,選擇花費最小的路徑。其實這也是一個求最短路徑的過程,只是它具有一個前提條件就是‘’在路程為最短‘’。這樣就可以稍微改動一下原floyd裡面的語句即可。
#include<stdio.h> #include<stdlib.h> #define INFINITY 65535 #define MAX 501 typedef int WeightType; typedef int DataType; typedef int Vertex; typedef struct GNode{ int Nv,Ne; WeightType G[MAX][MAX]; //記錄城市之間的高速路的距離的鄰接舉證 DataType G1[MAX][MAX]; //記錄城市之間的高速路的花費的鄰接矩陣 }PtrToGNode,*MGraph; typedef struct ENode{ Vertex V1,V2; WeightType Weight; DataType Data; }PtrToENode,*Edge; MGraph CreateGraph(int VertexNum){ MGraph graph; graph = (MGraph)malloc(sizeof(struct GNode)); graph->Nv = VertexNum; graph->Ne = 0; Vertex V, W; for(V=0; V<graph->Nv; V++) for(W=0; W<graph->Nv; W++) graph->G[V][W] = INFINITY; return graph; } void InsertEdge(MGraph graph, Edge E){ Vertex V = E->V1; Vertex W = E->V2; graph->G[V][W] = E->Weight; graph->G[W][V] = E->Weight; graph->G1[V][W] = E->Data; graph->G1[W][V] = E->Data; } int D[MAX][MAX]; int Cost[MAX][MAX]; int Path[MAX][MAX]; void Floyd(MGraph graph){ int i, j, k; for(i=0; i<graph->Nv; i++){ for(j=0; j<graph->Nv; j++){ D[i][j] = graph->G[i][j]; Cost[i][j] = graph->G1[i][j]; Path[i][j] = -1; } } for(k=0; k<graph->Nv; k++){ for(i=0; i<graph->Nv; i++){ for(j=0; j<graph->Nv; j++){ if(D[i][k]+D[k][j]<D[i][j]||(D[i][k]+D[k][j]==D[i][j]&& Cost[i][k]+Cost[k][j]<Cost[i][j])){//路徑相等時,且話費更少時,更新路徑 D[i][j] = D[i][k]+D[k][j]; Path[i][j] = k; Cost[i][j] = Cost[i][k]+Cost[k][j]; } } } } } int a[MAX]; int num = 1; void ThePath(Vertex V, Vertex W){ Vertex S = Path[V][W]; if(S==-1){ return; } ThePath(V, S); a[num++] = S; ThePath(S, W); } int main(){ int N, M; Vertex V, W; scanf("%d%d%d%d",&N, &M, &V, &W); MGraph graph = CreateGraph(N); graph->Nv = N; graph->Ne = M; Vertex i; Edge E; for(i=0; i<M; i++){ E = (Edge)malloc(sizeof(struct ENode)); scanf("%d%d%d%d",&E->V1,&E->V2,&E->Weight,&E->Data); InsertEdge(graph, E); } Floyd(graph); printf("%d%d",D[V][W],Cost[V][W]); return 0; }