Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <queue>
- int findShortestWay(int numOfVertices, int a, int b, int start, int end) {
- int k = std::max(a, b);
- std::vector<std::queue<int>> queues(k + 1, std::queue<int>());
- long long currentVertex = start;
- std::vector<int> distance(numOfVertices, -1);
- distance[start] = 0;
- queues[0].push(start);
- int currentQueue = 0;
- while (currentVertex != end) {
- while (!queues[currentQueue].empty()) {
- currentVertex = queues[currentQueue].front();
- queues[currentQueue].pop();
- if (currentVertex % numOfVertices == currentVertex * currentVertex % numOfVertices) {
- if (distance[(currentVertex + 1) % numOfVertices] == -1) {
- int minEdge = std::min(a, b);
- distance[(currentVertex + 1) % numOfVertices] = distance[currentVertex] + minEdge;
- queues[(currentQueue + minEdge) % (k + 1)].push((currentVertex + 1) % numOfVertices);
- }
- } else {
- if (distance[(currentVertex + 1) % numOfVertices] == -1) {
- distance[(currentVertex + 1) % numOfVertices] = distance[currentVertex] + a;
- queues[(currentQueue + a) % (k + 1)].push((currentVertex + 1) % numOfVertices);
- }
- if (distance[(currentVertex * currentVertex + 1) % numOfVertices] == -1) {
- distance[(currentVertex * currentVertex + 1) % numOfVertices] = distance[currentVertex] + b;
- queues[(currentQueue + b) % (k + 1)].push((currentVertex * currentVertex + 1) % numOfVertices);
- }
- }
- if (distance[end] != -1) {
- return distance[end];
- }
- }
- ++currentQueue;
- currentQueue %= k + 1;
- }
- return distance[end];
- }
- int main() {
- int numOfVertices;
- int a;
- int b;
- int x;
- int y;
- std::cin >> a >> b >> numOfVertices >> x >> y;
- std::cout << findShortestWay(numOfVertices, a, b, x, y);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement