Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "iostream"
- #include "utility"
- #include "algorithm"
- #include "set"
- #include "vector"
- #include "map"
- #include "iterator"
- #include "functional"
- // #include "sstream"
- #include "iomanip"
- #include "deque"
- #include "stack"
- #include "queue"
- #include "cstring"
- #include "cmath"
- #define ll long long
- #define REP(i,n) for(ll i=0;i<n;i++)
- #define REPREV(i,n) for(ll i=n;i>=0;i--)
- #define IREP(in,i,n) for(ll i=in;i<n;i++)
- #define dbg(msg) //cout << msg << endl;
- #define var(n,x) cout << n << " = " << x << endl;
- using namespace std;
- bool solve(){
- int n;
- if(!(cin >> n)) return false;
- vector<int> citiesOut;
- citiesOut.push_back(0);
- REP(i, n){
- int c;
- cin >> c;
- citiesOut.push_back(c);
- }
- int c;
- cin >> c;
- REP(i, c){
- int a, b, flight1 = 0, flight2 = 0, skip = 0, from, to, valid1 = 1, valid2 = 1;
- std::vector<int> AtoB;
- std::vector<int> BtoA;
- cin >> a >> b;
- if (a == b) {
- skip = true;
- }
- from = a;
- AtoB.push_back(a);
- for (int i = 0; i < n && !skip; ++i) {
- to = citiesOut[from];
- if(find(AtoB.begin(), AtoB.end(), to) == AtoB.end()){
- AtoB.push_back(to);
- from = to;
- } else break;
- }
- from = b;
- BtoA.push_back(b);
- for (int i = 0; i < n && !skip; ++i) {
- to = citiesOut[from];
- if(find(BtoA.begin(), BtoA.end(), to) == BtoA.end()){
- BtoA.push_back(to);
- from = to;
- } else break;
- }
- int intersect = AtoB.size()+BtoA.size()+1;
- REP(x, AtoB.size()){
- REP(y, BtoA.size()){
- if(AtoB[x] == BtoA[y]){
- if(x+y < intersect)
- intersect = x+y;
- }
- }
- }
- if (intersect != AtoB.size()+BtoA.size()+1)
- cout << intersect << endl;
- else
- cout << -1 << endl;
- }
- return true;
- }
- int main(int argv, char** argc){
- while(solve());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement