Advertisement
leanchec

Untitled

Sep 25th, 2024
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.70 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define int long long
  5. const int MAXN=1e5+10;
  6.  
  7. vector<pair<pair<int,int>, int>> adj[MAXN][2];
  8.  
  9. int32_t main(){
  10.     ios_base::sync_with_stdio(0); cin.tie(0);
  11.     int n, k1, k2, p;
  12.     cin >> n >> k1 >> k2 >> p;
  13.  
  14.     for(int i=0; i<k1; i++){
  15.         int a, b;
  16.         cin >> a >> b;
  17.         adj[a][0].push_back({{b, 0}, 0});
  18.         adj[a][1].push_back({{b, 0}, 1});
  19.         adj[b][0].push_back({{a, 0}, 0});
  20.         adj[b][1].push_back({{a, 0}, 1});
  21.     }
  22.  
  23.     for(int i=0; i<k2; i++){
  24.         int a, b;
  25.         cin >> a >> b;
  26.         adj[a][0].push_back({{b, 1}, 1});
  27.         adj[a][1].push_back({{b, 1}, 0});
  28.         adj[b][0].push_back({{a, 1}, 1});
  29.         adj[b][1].push_back({{a, 1}, 0});
  30.     }
  31.  
  32.     int dist[MAXN][2];
  33.     for(int i=1; i<=n; i++){
  34.         dist[i][0]=1e9;
  35.         dist[i][1]=1e9;
  36.     }
  37.  
  38.     int a, b;
  39.     cin >> a >> b;
  40.     dist[a][0]=dist[a][1]=1;
  41.  
  42.     deque<pair<int,int>> fila;
  43.     fila.push_front({a, 0});
  44.     fila.push_front({a, 1});
  45.  
  46.     while(fila.size()){
  47.         pair<int,int> atual=fila.front();
  48.         fila.pop_front();
  49.  
  50.         int pos=atual.first, sis=atual.second;
  51.  
  52.         for(int i=0; i<(int)adj[pos][sis].size(); i++){
  53.             int viz=adj[pos][sis][i].first.first, vs=adj[pos][sis][i].first.second;
  54.             int d=adj[pos][sis][i].second;
  55.             if(dist[viz][vs]>dist[pos][sis]+d){
  56.                 dist[viz][vs]=dist[pos][sis]+d;
  57.                 if(d==0)fila.push_front({viz, vs});
  58.                 else fila.push_back({viz, vs});
  59.             }
  60.         }
  61.     }
  62.  
  63.     if(min(dist[b][0], dist[b][1])!=1e9)cout << min(dist[b][0], dist[b][1])*p << endl;
  64.     else cout << -1 << endl;
  65.  
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement