Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <cstdio>
- #include <vector>
- #include <iostream>
- #include <algorithm>
- #include <unordered_map>
- #include <unordered_set>
- #include <queue>
- using namespace std;
- unordered_map<int, vector<int>> graph;
- int find(vector<int>& priorities, int prioritiesCount, int start){
- int searchFor = 1;
- int sum = 0;
- priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<>> next;
- //sumSoFar, index, AddedInSearchFor
- unordered_set<int> inCurrentSearch;
- next.push({0, {start, 1}});
- while(!next.empty()){
- auto current = next.top();
- next.pop();
- int currSumSoFar = current.first;
- int currIndex = current.second.first;
- if(inCurrentSearch.find(currIndex) != inCurrentSearch.end())
- continue;
- inCurrentSearch.insert(currIndex);
- if(priorities[currIndex] == searchFor){
- if(searchFor == prioritiesCount)
- return currSumSoFar;
- searchFor++;
- inCurrentSearch.clear();
- }
- for(int neighbour : graph[currIndex]){
- if(priorities[neighbour] > searchFor){
- continue;
- }
- next.push({currSumSoFar + 1, {neighbour, searchFor}});
- }
- while(!next.empty() && next.top().second.second < searchFor)
- next.pop();
- }
- return -1;
- }
- int main() {
- int n, m, a, b, k;
- cin >> n >> m;
- vector<int> priorities(n, -1);
- for(int i = 0; i < m; i++){
- cin >> a >> b;
- if (a == b)
- continue;
- graph[a].push_back(b);
- }
- cin >> k;
- int start = 0;
- for(int i = 1; i <= k; i++){
- cin >> a;
- if(i == 1)
- start = a;
- priorities[a] = i;
- }
- cout << find(priorities, k, start);
- }
Advertisement
Add Comment
Please, Sign In to add comment