旅游规划

粘题目咯:

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

输入格式说明:

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

输出格式说明:

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

样例输入与输出:

序号输入输出
1
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
2
2 1 0 1
1 0 2 3
2 3

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

源码:

#include<iostream>
using namespace std;

#define MaxNum 10000

typedef 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;
}
    原文作者:旅游交通路线问题
    原文地址: https://blog.csdn.net/phenixfate/article/details/42749613
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞