Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- const int MAXN=1e5+10;
- vector<pair<pair<int,int>, int>> adj[MAXN][2];
- int32_t main(){
- ios_base::sync_with_stdio(0); cin.tie(0);
- int n, k1, k2, p;
- cin >> n >> k1 >> k2 >> p;
- for(int i=0; i<k1; i++){
- int a, b;
- cin >> a >> b;
- adj[a][0].push_back({{b, 0}, 0});
- adj[a][1].push_back({{b, 0}, 1});
- adj[b][0].push_back({{a, 0}, 0});
- adj[b][1].push_back({{a, 0}, 1});
- }
- for(int i=0; i<k2; i++){
- int a, b;
- cin >> a >> b;
- adj[a][0].push_back({{b, 1}, 1});
- adj[a][1].push_back({{b, 1}, 0});
- adj[b][0].push_back({{a, 1}, 1});
- adj[b][1].push_back({{a, 1}, 0});
- }
- int dist[MAXN][2];
- for(int i=1; i<=n; i++){
- dist[i][0]=1e9;
- dist[i][1]=1e9;
- }
- int a, b;
- cin >> a >> b;
- dist[a][0]=dist[a][1]=1;
- deque<pair<int,int>> fila;
- fila.push_front({a, 0});
- fila.push_front({a, 1});
- while(fila.size()){
- pair<int,int> atual=fila.front();
- fila.pop_front();
- int pos=atual.first, sis=atual.second;
- for(int i=0; i<(int)adj[pos][sis].size(); i++){
- int viz=adj[pos][sis][i].first.first, vs=adj[pos][sis][i].first.second;
- int d=adj[pos][sis][i].second;
- if(dist[viz][vs]>dist[pos][sis]+d){
- dist[viz][vs]=dist[pos][sis]+d;
- if(d==0)fila.push_front({viz, vs});
- else fila.push_back({viz, vs});
- }
- }
- }
- if(min(dist[b][0], dist[b][1])!=1e9)cout << min(dist[b][0], dist[b][1])*p << endl;
- else cout << -1 << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement