当前位置: 首页 > news >正文

洛谷P1135多题解

 解法1:BFS,有n个节点每个节点最多被访问一次,所以BFS时间复杂度为O(n)。注意a==b的特判。

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 205;
int n, a, b;
int k[N], s[N];
bool st[N];
int dy[2];
int main() {
	cin >> n >> a >> b;
	if (a == b) {
		cout << 0 << endl;
		return 0;
	}
	for (int i = 1; i <= n; i++) {
		cin >> k[i];
	}
	memset(s, -1, sizeof(s));
	s[a] = 0;
	st[a] = true;
	queue<int> q;
	q.push(a);
	while (q.size()) {
		int t = q.front();
		q.pop();
		dy[0] = k[t], dy[1] = -k[t];
		for (int i = 0; i < 2; i++) {
			int u = t + dy[i];
			if (u == b) {
				cout << s[t] + 1 << endl;
				return 0;
			}
			if (u < 1 || u > n || st[u])continue;
			st[u] = true;
			s[u] = s[t] + 1;
			q.push(u);
		}
	}
	cout << -1 << endl;
	return 0;
}

解法2:DFS,时间复杂度是O(2^n)有点大。剪了枝还是TLE

#include<iostream>
#include<climits>
#include<cstring>
using namespace std;
int n, a, b;
int k[205];
bool st[205];
int minn = INT_MAX;
void dfs(int u, int step){
	if(step >= minn)return;
	if(u == b){
		minn = min(minn, step);
		return;
	}
	if(u < 1 || u > n || st[u])return;
	st[u] = true;
	int up = u + k[u];
	if(up <= n){
		dfs(up, step + 1);
	}
	int down = u - k[u];
	if(down >= 1){
		dfs(down, step + 1);
	}
	st[u] = false;
}
int main(){
	cin >> n >> a >> b;
	for(int i = 1; i <= n; i++){
		cin >> k[i];
	}
	dfs(a, 0);
	if(minn == INT_MAX)cout << -1 << endl;
	else cout << minn << endl;
	
	return 0;
}

解法3:迪杰斯特拉堆优化,时间复杂度为O((v+e)logv)

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 205;
int k[N];
bool st[N];
int dist[N];
typedef pair<int, int>PII;
int n, a, b;
int dijkstra(){
	memset(dist, 0x3f, sizeof(dist));
	dist[a] = 0;
	priority_queue<PII, vector<PII>, greater<PII>>heap;
	heap.push({0, a});
	while(heap.size()){
		auto t = heap.top();
		heap.pop();
		int ver = t.second, distance = t.first;
		if(ver == b)return distance;
		if(st[ver])continue;
		st[ver] = true;
		
		int up = ver + k[ver];
		if(up <= n && dist[up] > distance + 1){
			dist[up] = distance + 1;
			heap.push({dist[up], up});
		}
		
		int down = ver - k[ver];
		if(down >= 1 && dist[down] > distance + 1){
			dist[down] = distance + 1;
			heap.push({dist[down], down});
		}
	}
	return -1;
}
int main(){
	cin >> n >> a >> b;
	for(int i = 1; i <= n; i++){
		cin >> k[i];
	}
	int t = dijkstra();
	cout << t << endl;
	
	return 0;
}

解法4:SPFA,

相关文章:

  • Pytorch使用手册-音频数据增强(专题二十)
  • 显卡(Graphics Processing Unit,GPU)架构详细解读
  • Linux 第二次脚本作业
  • [设计模式] Builder 建造者模式
  • [Windows] 全国油价实时查询,可具体到城市
  • TCP/UDP调试工具推荐:Socket通信图解教程
  • vscode settings(二):文件资源管理器编辑功能主题快捷键
  • 字符串中字母的大小写转换
  • 【模板】Linux中cmake使用编译c++程序
  • 【JavaEE进阶】Spring DI
  • 基于Springboot银行信用卡额度管理系统【附源码】
  • 学术论文翻译
  • 俄罗斯方块
  • 多线程群聊服务器设计
  • 500字理透react的hook闭包问题
  • RPC 框架项目剖析
  • 网络和操作系统基础篇
  • Python pip 缓存清理:全面方法与操作指南
  • 【算法通关村 Day9】二分查找与二叉树的中序遍历
  • 人工智能_大模型092_超简单_win10中安装deepseek_效果非常好_亲测_带RGA功能_桌面版---人工智能工作笔记0237
  • 新华时评:防范安全事故须臾不可放松
  • 证监会:坚决拥护党中央对王建军进行纪律审查和监察调查的决定
  • 中央网信办:重点整治违规AI产品、利用AI制作发布谣言等突出问题
  • 江西德安回应“义门陈遗址建筑被没收”:将交由规范的义门陈相关社会组织管理
  • 4月制造业PMI为49%,比上月下降1.5个百分点
  • 运动健康|不同能力跑者,跑步前后营养补给差别这么大?