D_L3

Shortest tour

Jan 25th, 2024
1,187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <unordered_map>
  7. #include <unordered_set>
  8.  
  9. #include <queue>
  10.  
  11. using namespace std;
  12.  
  13. unordered_map<int, vector<int>> graph;
  14.  
  15. int find(vector<int>& priorities, int prioritiesCount, int start){
  16.     int searchFor = 1;
  17.     int sum = 0;
  18.    
  19.     priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<>> next;
  20.     //sumSoFar, index, AddedInSearchFor
  21.    
  22.     unordered_set<int> inCurrentSearch;
  23.     next.push({0, {start, 1}});
  24.    
  25.     while(!next.empty()){
  26.         auto current = next.top();
  27.         next.pop();
  28.  
  29.         int currSumSoFar = current.first;
  30.         int currIndex = current.second.first;
  31.         if(inCurrentSearch.find(currIndex) != inCurrentSearch.end())
  32.             continue;
  33.        
  34.         inCurrentSearch.insert(currIndex);
  35.        
  36.         if(priorities[currIndex] == searchFor){
  37.             if(searchFor == prioritiesCount)
  38.                 return currSumSoFar;
  39.             searchFor++;
  40.             inCurrentSearch.clear();
  41.         }
  42.        
  43.         for(int neighbour : graph[currIndex]){
  44.             if(priorities[neighbour] > searchFor){
  45.                 continue;
  46.             }
  47.             next.push({currSumSoFar + 1, {neighbour, searchFor}});
  48.         }
  49.        
  50.         while(!next.empty() && next.top().second.second < searchFor)
  51.             next.pop();
  52.     }
  53.     return -1;
  54. }
  55.  
  56. int main() {
  57.     int n, m, a, b, k;
  58.     cin >> n >> m;
  59.     vector<int> priorities(n, -1);
  60.     for(int i = 0; i < m; i++){
  61.         cin >> a >> b;
  62.         if (a == b)
  63.            continue;
  64.         graph[a].push_back(b);
  65.     }
  66.     cin >> k;
  67.     int start = 0;
  68.     for(int i = 1; i <= k; i++){
  69.         cin >> a;
  70.         if(i == 1)
  71.             start = a;
  72.         priorities[a] = i;
  73.     }
  74.    
  75.     cout << find(priorities, k, start);
  76.    
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment