07-图6 旅游规划 (25 分)

xiaoxiao2025-10-18  12

07-图6 旅游规划 (25 分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第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

源代码: 

#include<iostream> #include<cstdio> #include<cstring> #include<vector> #define INF 10000000 using namespace std; const int Max=500; int Map[Max+5][Max+5]; int Cost[Max+5][Max+5]; int dis[Max+5],MCost[Max+5]; bool vis[Max+5]={false}; int Min; void Dijkstra(int v0,int v,int d){ dis[v0]=0; vis[v0]=true; for(int i=0;i<v;i++){ Min=INF; for(int k=0;k<v;k++){ if(!vis[k]){ if(dis[k]<Min){ Min=dis[k]; v0=k; } } } vis[v0]=true; for(int k=0;k<v;k++){ if(!vis[k]&&Min+Map[v0][k]<dis[k]){ dis[k]=Min+Map[v0][k]; MCost[k]=MCost[v0]+Cost[v0][k]; } else if(!vis[k]&&Min+Map[v0][k]==dis[k]&&MCost[k]>MCost[v0]+Cost[v0][k]){ MCost[k]=MCost[v0]+Cost[v0][k]; } } } } int main(){ int v,e,s,d; scanf("%d %d %d %d",&v,&e,&s,&d); for(int i=0;i<v;i++) for(int j=0;j<v;j++){ Map[i][j]=Map[j][i]=INF; Cost[i][j]=Cost[j][i]=INF; //设置为双向连通,并初始化为最大值 } for(int i=0;i<e;i++){ int a,b,c,d; cin>>a>>b>>c>>d; Map[a][b]=Map[b][a]=c; Cost[a][b]=Cost[b][a]=d; } for(int i=0;i<v;i++){ dis[i]=Map[i][s];//Map[i][s]为点i到起始点的距离 MCost[i]=Cost[i][s]; } Dijkstra(s,v,d); cout<<dis[d]<<" "<<MCost[d]<<endl; return 0; }

解析:

          题目的思路真的是非常简单,其实就是迪杰斯特拉算法的简单应用。不同于之前杭电oj上的畅通工程续,这里我们需要这样做:用一个dis一维数组和一个MCost一维数组分别记录总的花费距离和总的花费金额,然后用迪杰斯特拉的算法不断更新这两个数组,最后进行输出。

转载请注明原文地址: https://www.6miu.com/read-5038138.html

最新回复(0)