PTA数据结构与算法题目集(中文) 7-9
7-9 旅游规划 (25 分)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2)是城市的个数,顺便假设城市的编号为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算法基本题 注意本题中不需要输出 最短路径的顺序 所以不需要记录路径的Path数组 需要记录源点到目标点的路径长度Dist数组 还要注意决定路径的是长度和价格两个因素 所以再判断完长度后要判断价格 如果因素更多,要增加更多的判断
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 #define MAXVERTEXNUM 500 6 #define INIFITY 65535 7 8 typedef struct ENode* Edge; 9 struct ENode 10 { 11 int V1, V2; 12 int Length; 13 int Weight; 14 }; 15 16 typedef struct EleNode 17 { 18 int Length; 19 int Weight; 20 }ElementType; 21 22 typedef struct GNode* Graph; 23 struct GNode 24 { 25 int Nv; 26 int Ne; 27 ElementType G[MAXVERTEXNUM][MAXVERTEXNUM]; 28 }; 29 30 Graph BuildGraph(int VertexNum) 31 { 32 Graph Gra = (Graph)malloc(sizeof(struct GNode)); 33 Gra->Nv = VertexNum; 34 Gra->Ne = 0; 35 for(int i=0;i<Gra->Nv;i++) 36 for (int j = 0; j < Gra->Nv; j++) 37 { 38 if (i == j) 39 { 40 Gra->G[i][j].Length = 0; 41 Gra->G[i][j].Weight = 0; 42 } 43 else 44 { 45 Gra->G[i][j].Length = INIFITY; 46 Gra->G[i][j].Weight = INIFITY; 47 } 48 } 49 return Gra; 50 } 51 52 void Insert(Edge E, Graph Gra) 53 { 54 Gra->G[E->V1][E->V2].Length = E->Length; 55 Gra->G[E->V1][E->V2].Weight = E->Weight; 56 57 Gra->G[E->V2][E->V1].Length = E->Length; 58 Gra->G[E->V2][E->V1].Weight = E->Weight; 59 } 60 61 Graph CreateGraph(int N,int M) 62 { 63 Edge E = (Edge)malloc(sizeof(struct ENode)); 64 Graph Gra = BuildGraph(N); 65 Gra->Ne = M; 66 for (int i = 0; i < Gra->Ne; i++) 67 { 68 scanf("%d%d%d%d", &(E->V1), &(E->V2), &(E->Length), &(E->Weight)); 69 Insert(E, Gra); 70 } 71 return Gra; 72 } 73 74 int Dist[MAXVERTEXNUM]; 75 int Price[MAXVERTEXNUM]; 76 int Collected[MAXVERTEXNUM]; 77 int FindMin(Graph G) 78 { 79 int MinDist= INIFITY; 80 int Min = -1; 81 for (int i = 0; i < G->Nv; i++) 82 { 83 if (!Collected[i] && Dist[i] < MinDist) 84 { 85 MinDist = Dist[i]; 86 Min = i; 87 } 88 } 89 return Min; 90 } 91 void Dijkstra(Graph Gra, int V) 92 { 93 for (int i = 0; i < Gra->Nv; i++) 94 { 95 Dist[i] = Gra->G[V][i].Length; 96 Price[i] = Gra->G[V][i].Weight; 97 } 98 Collected[V] = 1; 99 while (1) 100 { 101 int Min = FindMin(Gra); 102 if (Min == -1) 103 break; 104 for (int i = 0; i < Gra->Nv; i++) 105 { 106 if (!Collected[i]&&Dist[Min] + Gra->G[Min][i].Length < Dist[i]) 107 { 108 Dist[i] = Dist[Min] + Gra->G[Min][i].Length; 109 Price[i] = Price[Min] + Gra->G[Min][i].Weight; 110 } 111 else if (!Collected[i]&&Dist[Min] + Gra->G[Min][i].Length == Dist[i] && Price[Min] + Gra->G[Min][i].Weight < Price[i]) 112 { 113 Price[i] = Price[Min] + Gra->G[Min][i].Weight; 114 } 115 } 116 Collected[Min] = 1; 117 } 118 } 119 int main() 120 { 121 int N, M,S,D; 122 scanf("%d%d%d%d", &N, &M, &S, &D); 123 Graph G = CreateGraph(N, M); 124 Dijkstra(G, S); 125 printf("%d %d", Dist[D],Price[D]); 126 return 0; 127 }