Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <set>
- using namespace std;
- const int MAXN = 1000002;
- const int INF = 1000000000;
- int D[MAXN];
- int a[MAXN];
- vector < int > G[MAXN];
- int n,m,tm,u,i,k,v,v1,v2,nt,wait;
- class Mycmp
- {
- public:
- bool operator () ( int v1, int v2)
- {
- if (D[v1] < D[v2])
- return true;
- if (D[v2] < D[v1])
- return false;
- if (D[v1] == D[v2])
- return v1>v2;
- }
- };
- set <int,Mycmp > X;
- int main()
- {
- freopen("badsanta.in","r",stdin);
- freopen("badsanta.out","w",stdout);
- cin >> n >> m >>k;
- for (i=0; i<m; i++)
- {
- cin >> v1 >> v2;
- G[v1].push_back(v2);
- G[v2].push_back(v1);
- }
- for (i=0; i<k; i++)
- cin >> a[i];
- if (a[0] == 1)
- {
- cout<< -1<<endl;
- return 0;
- }
- for (i=1; i<=n; i++)
- D[i] = INF;
- D[1] = 0;
- X.insert(1);
- while (X.size() >0)
- {
- v = *X.begin();
- X.erase(X.begin());
- if (D[v] == INF)
- break;
- for (i=0; i < G[v].size(); i++)
- {
- u = G[v][i];
- tm = D[v];
- /*if (make_pair(a [tm%k] , a[(tm+1) % k]) == make_pair(u,v))
- continue;*/
- for (wait = 0; wait <= 20; wait ++)
- {
- nt = tm + wait;
- if (a[nt %k ] == v)
- break;
- if (a[(tm+wait+1)%k] == v && u == a[(tm+wait) % k])
- continue;
- if (u == a[(tm+wait+1) %k])
- continue;
- if (D[u] > tm +wait +1)
- {
- X.erase(u);
- D[u] = tm + wait + 1;
- X.insert(u);
- //break;
- }
- }
- }
- }
- if (D[n] == INF)
- cout << -1 <<endl;
- else
- cout <<D[n] <<endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment