旅游规划

来源:互联网 发布:金华公务员网络学校 编辑:程序博客网 时间:2024/04/28 23:39

粘题目咯:

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

输入格式说明:

输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式说明:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

样例输入与输出:

序号输入输出1
4 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 20
3 40
2
2 1 0 11 0 2 3
2 3

这道题就是一道Dijastra算法题,存储时运用2个二维数组构建成邻接表来分别存储 两城市之间的距离和 需要的费用,注意点的就是 Dijastra算法 不仅需要判断 dist 还需要判断 acost 


源码:

#include<iostream>using namespace std;#define MaxNum 10000typedef int ElemType;int main(){int N,M;ElemType S,D;cin>>N>>M>>S>>D;//用邻接矩阵存储图 int **len = new int*[N];//储存公路长度int **cost = new int*[N];//储存费用        for(int i=0; i<N; i++){            len[i] = new int[N];            cost[i] = new int[N];        }  //初始化for(int i=0;i<N;i++){for(int j=0;j<N;j++){len[i][j] = MaxNum;cost[i][j] = MaxNum;}} //构建邻接矩阵,处理输入数据for(int i=0;i<M;i++){ElemType c1,c2; int l,c; cin>>c1>>c2>>l>>c; len[c1][c2] = l; len[c2][c1] = l; cost[c1][c2] = c; cost[c2][c1] = c;}   //Dijastra算法开始int *dist = new int[N];           //记录当前路径长度int *acost = new int[N]; //记录当前花费//初始化for(int i=0;i<N;i++){dist[i] = MaxNum;  acost[i] = MaxNum;} dist[S] = 0;acost[S] = 0;   //进行算法 for(int k=0;k<2;k++){   for(int v=0;v<N;v++){for(int w=0;w<N;w++){   if(dist[v] != MaxNum){   if(dist[v]+len[v][w] < dist[w])   dist[w] = dist[v] + len[v][w];else if(dist[v] + len[v][w] == dist[w] && acost[v] != MaxNum && acost[v]+cost[v][w] <acost[w])acost[w] = acost[v] + cost[v][w];}}    }       } cout<<dist[D] << " " <<acost[D] <<endl;return 0;}


0 0
原创粉丝点击