欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 洛谷P1135多题解

洛谷P1135多题解

2025/2/24 9:38:59 来源:https://blog.csdn.net/2403_88875937/article/details/145812148  浏览:    关键词:洛谷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,

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词