pat 1003 Emergency (值得重点回顾)

本文介绍了一种结合Dijkstra算法与深度优先搜索(DFS)的方法,用于计算从单一源点出发到达目标点的所有最短路径数量及其经过节点的最大权重之和。通过递归实现DFS,确保找到所有可能的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始看错题意,题意是要求单源点对最短路径数和最大的点权重之和。知道要用dijskra算法,但为了求最短路径数,还得用深搜,依次把点加入集合中,若路径长度=最短路径值时,路径数+1。同时求出最大的点权重之和。

递归函数{
出口条件处理(最低级的情况);
return ...;
从第1列的8个位置{
依次尝试设置格子及限制区域
向下级递归
复原上一次尝试
}
};


AC代码:

#include<iostream>
using namespace std;
const int INF=1000000;
const int NUM=505;
int map[NUM][NUM];
int team[NUM],isVisit[NUM];
int dist[NUM];
int ans,maxTeamNum;

void init()
{
	int i,j;
	for(i=0;i<NUM;i++){
		isVisit[i]=0;
		team[i]=0;
		dist[i]=INF;
		for(j=0;j<NUM;j++){
			if(j!=i){
				map[i][j]=INF;//初始化为无穷大,表示不连通
				map[j][i]=INF;
			}

		}
	}
}
void dijskra(int n,int source)
{
	
	int i,minDis=INF,index=0,j;
	for(i=0;i<n;i++){
		dist[i]=map[source][i];
	}
	isVisit[source]=1;//将其加入已访问点的集合
	for(i=0;i<n-1;i++){
		minDis=INF;
		index=0;
		for(j=0;j<n;j++){
			if(!isVisit[j]&&dist[j]<minDis){//找到最小距离点
				minDis=dist[j];
				index=j;
			}
		}
		isVisit[index]=1;//将其加入已访问点的集合
		for(j=0;j<n;j++){//更新源点与每个点之间的距离
			if(map[index][j]<INF&&dist[j]>dist[index]+map[index][j])
				dist[j]=dist[index]+map[index][j];
		}
	}
	
	
}

void dfs(int n,int cId,int dest,int curDis,int curTeamNum)
{
	int i;
	isVisit[cId]=1;
	if(cId==dest){
		if(curDis==dist[dest]){
			ans++;//最短路径数+1
			if(curTeamNum>maxTeamNum)
				maxTeamNum=curTeamNum;
		}
		return;
	} 
	if(curDis>dist[dest])//当前的路径长度已经超过最短路径,就没有必要继续搜索了。
		return;
	for(i=0;i<n;i++){
		if(!isVisit[i]&&map[cId][i]<INF){//城市i未被访问过,且cId到i连通
			dfs(n,i,dest,curDis+map[cId][i],curTeamNum+team[i]);
			isVisit[i]=0;
		}
	}
}

int main()
{
	int n,m,source,dest,i;
	int c1,c2,l;
	freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);

	cin>>n>>m>>source>>dest;
	init();
	for(i=0;i<n;i++)
		cin>>team[i];
	for(i=0;i<m;i++){
		cin>>c1>>c2>>l;
		map[c1][c2]=l;
		map[c2][c1]=l;
	}
	dijskra(n,source);
	for(i=0;i<n;i++)
		isVisit[i]=0;
	dfs(n,source,dest,0,team[source]);
	cout<<ans<<" "<<maxTeamNum<<endl;
	return 0;


}

DFS递归的基本套路:



当前提供的引用内容并未涉及 PAT 1003 的具体描述或解决方案。然而,可以基于 PAT 题目的常见模式以及算法竞赛的知识体系来推测其可能的内容。 通常情况下,PAT(Programming Ability Test)中的题目会围绕常见的数据结构与算法展开,如字符串处理、动态规划、图论、贪心算法等。对于 PAT 1003,虽然具体的题目尚未提供,但可以根据 PAT 考试的特点推断出一些通用的信息: ### 可能的主题范围 如果 PAT 1003 是一道典型的编程题,则它可能会涉及到以下主题之一: - **字符串操作**:如子串匹配、正则表达式应用等。 - **数组/列表操作**:查找最大值、最小值或者特定条件下的元素组合。 - **基本算法设计**:如排序、二分查找或其他基础算法的应用。 以下是针对假设场景下的一般性讨论和代码实现示。 --- #### 假设情景一:字符串处理类问题 假如 PAT 1003 涉及到字符串的操作,比如统计字符频率并按某种规则排序输出,那么可以用如下方法解决: ```python from collections import Counter def process_string(s): count = Counter(s) # 统计每个字符出现次数 result = sorted(count.items(), key=lambda x: (-x[1], ord(x[0]))) # 排序逻辑 return ''.join([char * freq for char, freq in result]) input_str = input().strip() output_str = process_string(input_str) print(output_str) ``` 上述代码实现了对输入字符串中各字符按照频次降序排列的功能[^4]。若有相同频次,则依据 ASCII 编码顺序升序排列。 --- #### 假设情景二:简单数值计算型问题 另一种可能性是该题属于简单的数值运算范畴,如求解一组数列的平均值及其偏差情况。 ```python import math def calculate_statistics(numbers): mean_value = sum(numbers) / len(numbers) variance = sum((num - mean_value)**2 for num in numbers) / len(numbers) std_deviation = math.sqrt(variance) return round(mean_value, 2), round(std_deviation, 2) raw_input = list(map(float, input().split())) mean, deviation = calculate_statistics(raw_input) print(f"{mean} {deviation}") ``` 此段程序能够接收一系列浮点数作为输入,并返回它们的均值与标准差结果[^5]。 --- 尽管目前无法确切得知 PAT 1003 的具体内容,但从以往经验来看,大多数此类考试都会集中考察考生的基础编码能力与逻辑思维水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值