PAT甲级1087

PAT甲级1087

题目大意:给出总城市数n,总道路数k以及起始城市。接下来n-1行给出除起点外每个城市的幸福指数,最后k行给出每两个城市之间的路程花费。首先要求从起点到ROM的最短距离,如果这样的最短距离有多条就统计总共有多少条。然后第二指标要求路径上的总幸福指数最高,如果总幸福指数也一样则输出平均幸福指数最高的一条路径(起始点幸福指数为0,算平均的时候必须挖去这个点)。
主要用到的Dijkstra+DFS,先求出起始点到每个城市的最短路径并且保存路径,然后DFS查找。这里总路径条数不能简单自加,要根据中间点u来更新路径条数。

#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <string>
#define INF 100000000
#define MAXN 210
using namespace std;

string destination="ROM";
int n,k,maxhappiness=0;
double maxaverage=0;
string start;
bool visit[MAXN];
int cost[MAXN][MAXN],happiness[MAXN],mincost[MAXN],totalroute[MAXN];
vector<int> path[MAXN],tmppath,path2;
map<string,int> city;
map<int,string> city2;
void init(){
	for(int i=0;i<n;i++)
		fill(cost[i],cost[i]+n,INF);
	fill(visit,visit+n,false);
	fill(mincost,mincost+n,INF);
	fill(totalroute,totalroute+n,1);
}
void Dijkstra(int index){
	mincost[index]=0;
	for(int i=0;i<n;i++){
		int u=-1,min_cost=INF;
		for(int j=0;j<n;j++){
			if(!visit[j]&&min_cost>mincost[j]){
				u=j;
				min_cost=mincost[j];
			}
		}
		if(u==-1) return ;
		visit[u]=true;
		for(int j=0;j<n;j++){
			if(!visit[j]&&cost[u][j]<INF&&cost[u][j]+mincost[u]<=mincost[j]){
				if(cost[u][j]+mincost[u]<mincost[j]){
					totalroute[j]=totalroute[u];
					mincost[j]=cost[u][j]+mincost[u];
					path[j].clear();
					path[j].push_back(u);
				}else{
					totalroute[j]+=totalroute[u];
					path[j].push_back(u);
				}
			}
		}
	}
}
void DFS(int index){
	if(index==0){
		tmppath.push_back(index);
		int tmpmaxhappiness=0;
		double tmpmaxaverage=0;
		for(int i=tmppath.size()-1;i>=0;i--){
			int id=tmppath[i];
			tmpmaxhappiness+=happiness[id];
		}
		if(tmpmaxhappiness>maxhappiness){
			maxhappiness=tmpmaxhappiness;
			maxaverage=maxhappiness*1.0/(tmppath.size()-1);
			path2=tmppath;
		}else if(tmpmaxhappiness==maxhappiness){
			tmpmaxaverage=maxhappiness*1.0/(tmppath.size()-1);
			if(tmpmaxaverage>maxaverage){
				maxaverage=tmpmaxaverage;
				path2=tmppath;
			}
		}
		tmppath.pop_back();
		return ;
	}
	tmppath.push_back(index);
	for(int i=0;i<path[index].size();i++){
		DFS(path[index][i]);
	}
	tmppath.pop_back();
}
int main(){
	string tmpcity1,tmpcity2;
	int tmphappiness,length;
	scanf("%d%d",&n,&k);
	init();
	cin>>start;
	city[start]=0;
	city2[0]=start;
	for(int i=1;i<n;i++){
		cin>>tmpcity1;
		scanf("%d",&tmphappiness);
		city[tmpcity1]=i;
		city2[i]=tmpcity1;
		happiness[i]=tmphappiness;
	}
	for(int i=0;i<k;i++){
		cin>>tmpcity1>>tmpcity2;
		scanf("%d",&length);
		cost[city[tmpcity1]][city[tmpcity2]]=length;
		cost[city[tmpcity2]][city[tmpcity1]]=length;
	}
	Dijkstra(0);
	DFS(city[destination]);
	printf("%d %d %d %d\n",totalroute[city[destination]],mincost[city[destination]],maxhappiness,(int)maxaverage);
	for(int i=path2.size()-1;i>=0;i--){
		cout<<city2[path2[i]];
		if(i!=0) printf("->");
	}
	system("pause");
	return 0;
}
### 关于 PAT 甲级 1024 题目 PAT (Programming Ability Test) 是一项编程能力测试,其中甲级考试面向有一定编程基础的学生。对于 PAT 甲级 1024 题目,虽然具体题目描述未直接给出,但从相似类型的题目分析来看,这类题目通常涉及较为复杂的算法设计。 #### 数据结构的选择与实现 针对此类问题,常用的数据结构包括但不限于二叉树节点定义: ```cpp struct Node { int val; Node* lchild, *rchild; }; ``` 此数据结构用于表示二叉树中的节点[^1]。通过这种方式构建的二叉树能够支持多种遍历操作,如前序、中序和后序遍历等。 #### 算法思路 当处理涉及到图论的问题时,深度优先搜索(DFS)是一种常见的解题策略。特别是当需要寻找最优路径或访问尽可能多的节点时,结合贪心算法可以在某些情况下提供有效的解决方案[^2]。 #### 输入输出格式说明 根据以往的经验,在解决 PAT 类型的问题时,输入部分往往遵循特定模式。例如,给定 N 行输入来描述每个节点的信息,每行按照如下格式:“Address Data Next”,这有助于理解如何解析输入并建立相应的数据模型[^4]。 #### 数学运算示例 有时也会遇到基本算术表达式的求值问题,比如分数之间的加减乘除运算。下面是一些简单的例子展示不同情况下的计算结果: - \( \frac{2}{3} + (-2) = -\frac{7}{3}\) -2) = -\frac{4}{3}\) - \( \frac{2}{3} ÷ (-2) = -\frac{1}{3}\) 这些运算是基于样例提供的信息得出的结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值