07-图6 旅游规划

如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

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

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

#include<iostream>
#include<cstdlib>
#include<string>
#include<cmath>
using namespace std;

#define MaxVertexNum 500
#define INFINITY 65535
typedef int Vertex;

struct DistCost {
	int Weight;
	int Cost;
};

struct GNode {
	int Nv;
	int Ne;
	struct DistCost G[MaxVertexNum][MaxVertexNum];
};
typedef struct GNode* MGraph;

struct ENode {
	int V1, V2;
	int Weight;
	int Cost;
};
typedef struct ENode* Edge;

MGraph CreateGraph(int VertexNum);
void InsertEdge(MGraph Graph, Edge E);
void Dijkstra(MGraph Graph, Vertex S, Vertex D);

int main()
{
	int S, D;
	MGraph Graph;
	Edge E;
	Vertex V;
	int N, i;

	cin >> N;
	Graph = CreateGraph(N);
	cin >> Graph->Ne;
	cin >> S >> D;
	if (Graph->Ne != 0) {
		E = (Edge)malloc(sizeof(struct ENode));
		for (i = 0; i < Graph->Ne; ++i) {
			cin >> E->V1 >> E->V2 >> E->Weight >> E->Cost;
			InsertEdge(Graph, E);
		}
	}

	Dijkstra(Graph, S, D);
 
	return 0;
}

MGraph CreateGraph(int VertexNum)
{
	MGraph Graph = (MGraph)malloc(sizeof(struct GNode));
	Graph->Ne = 0;
	Graph->Nv = VertexNum;
	for (int i = 0; i < Graph->Nv; ++i) {
		for (int j = 0; j < Graph->Nv; ++j) {
			Graph->G[i][j].Weight = INFINITY;
			Graph->G[i][j].Cost = INFINITY;
		}
	}

	return Graph;
}

//插入每条边的长度和收费额
void InsertEdge(MGraph Graph, Edge E)
{
	Graph->G[E->V1][E->V2].Weight = E->Weight;
	Graph->G[E->V2][E->V1].Weight = E->Weight;
	Graph->G[E->V1][E->V2].Cost = E->Cost;
	Graph->G[E->V2][E->V1].Cost = E->Cost;
}


int FindMinDist(MGraph Graph, int dist[], int collected[])
{
	int MinV, V;
	int MinDist = INFINITY;

	//访问每个节点找到距离最短路径最短的节点
	for (V = 0; V < Graph->Nv; ++V) {
		if (!collected[V] && dist[V] < MinDist) {
			MinDist = dist[V];
			MinV = V;
		}
	}

	if (MinDist < INFINITY)
		return MinV;
	else return -1;		//若无未访问节点,或不连通,返回-1
}

void Dijkstra(MGraph Graph, Vertex S, Vertex D)
{
	int collected[MaxVertexNum];		//记录是否已访问
	//dist记录邻接点到最短路径的距离, path记录邻接点的父节点(上一个节点)
	int dist[MaxVertexNum], path[MaxVertexNum], cost[MaxVertexNum];
	Vertex V, W;
	
	for (V = 0; V < Graph->Nv; ++V) {
		dist[V] = Graph->G[S][V].Weight;
		cost[V] = Graph->G[S][V].Cost;
		if (dist[V] < INFINITY) {		//若是源点邻接点则父节点初始化为源点
			path[V] = S;
		}
		else {
			path[V] = -1;		//否则为-1
		}
		collected[V] = false;		
	}
	
	dist[S] = 0;		//源点
	collected[S] = true;

	while (1) {
		//找到未访问的距离最短路径最短的节点.
		V = FindMinDist(Graph, dist, collected);		

		if (V == -1) {
			break;		//没有剩余节点或不连通退出循环
		}
		collected[V] = true;		//记录为已访问
		for (W = 0; W < Graph->Nv; ++W) {
			//访问每个邻接点
			if (!collected[W] && Graph->G[V][W].Weight < INFINITY) {
				//如果最短路径+VW间距离<W到源点距离
				if (dist[V] + Graph->G[V][W].Weight < dist[W]) {
					//W到源点的最短距离为最短路径+VW间距离
					dist[W] = dist[V] + Graph->G[V][W].Weight;
					//前节点为V
					path[W] = V;
					//过路费也同样设为最短路径过路费
					cost[W] = cost[V] + Graph->G[V][W].Cost;
				}
				//如果路径长度相等,选择过路费低的
				else if (dist[W] == dist[V] + Graph->G[V][W].Weight
					&& cost[W] > cost[V] + Graph->G[V][W].Cost) {
					//只改变前节点和过路费,因为长度相等没有必要改变.
					cost[W] = cost[V] + Graph->G[V][W].Cost;
					path[W] = V;
				}
			}
		}
	}
	cout << dist[D] << " " << cost[D] << endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EDAW旅游规划是根据EDAW(Environmental Design + Analysis Workshop)公司的专业知识和经验,为客户提供全方位的旅游规划服务。EDAW是一家国际性的设计和规划咨询公司,致力于城市和环境设计领域。 EDAW旅游规划的目标是为客户提供一流的旅游体验和可持续发展的旅游目的地。在规划过程中,EDAW会综合考虑目的地的资源、环境、社会经济和文化等方面的因素,以确保规划的可行性和可持续性。 首先,EDAW会对目的地的自然和文化资源进行全面评估和分析,了解其独特之处和发展潜力。然后,根据市场需求和客户的要求,制定旅游发展策略和规划框架。在规划过程中,EDAW会注重保护和提升目的地的自然环境,并尽量减少负面影响。 接下来,EDAW会进行市场调研和定位分析,确定目标客户群体和市场定位。根据市场需求,制定针对不同客户群体的旅游产品和服务策略,以提供个性化的旅游体验。 此外,EDAW还会考虑目的地的交通、酒店、餐饮等基础设施建设和改善,以提升旅游服务的质量和效率。同时,也会加强目的地的宣传推广,吸引更多的游客和投资者。 最后,EDAW还会制定监测和评估机制,以跟踪旅游规划的实施效果,并根据需要进行调整和改进。 总而言之,EDAW旅游规划一个综合性的过程,旨在为客户提供可持续发展的旅游目的地,创造卓越的旅游体验。通过综合考虑资源、环境、经济和文化等因素,EDAW可为客户提供有效的旅游规划解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值