vitormartinotti

metronibus

Oct 23rd, 2025
1,284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pii pair<int,int>
  3. #define MAXN 100010
  4.  
  5. using namespace std;
  6.  
  7. const int INF = 0x3f3f3f3f;
  8.  
  9. vector<pii> grafo[2*MAXN];
  10.  
  11. deque<pii> dq;
  12. int dist[2*MAXN];
  13.  
  14. void bfs01(int s){
  15.     dq.push_front({s, 0});
  16.     dist[s] = 0;
  17.  
  18.     while(!dq.empty()){
  19.         pii v = dq.front();
  20.         dq.pop_front();
  21.         for(auto e : grafo[v.first]){
  22.             int viz = e.first;
  23.             int w = e.second;
  24.             if(dist[v.first]+w < dist[viz]){
  25.                 dist[viz] = dist[v.first]+w;
  26.                 if(w == 1){
  27.                     dq.push_back(e);
  28.                 }
  29.                 else{
  30.                     dq.push_front(e);
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37. int main(){
  38.     int n, k1, k2, p;
  39.     scanf("%d %d %d %d", &n, &k1, &k2, &p);
  40.  
  41.     for(int i = 0; i < k1; i++){
  42.         int a, b; scanf("%d %d", &a, &b);
  43.         grafo[2*a-1].push_back({2*b-1, 0});
  44.         grafo[2*b-1].push_back({2*a-1, 0});
  45.     }
  46.  
  47.     for(int i = 0; i < k2; i++){
  48.         int a, b; scanf("%d %d", &a, &b);
  49.         grafo[2*a].push_back({2*b, 0});
  50.         grafo[2*b].push_back({2*a, 0});
  51.     }
  52.  
  53.     int ini, fim; scanf("%d %d", &ini, &fim);
  54.  
  55.     for(int i = 1; i <= 2*n; i+=2){
  56.         if(grafo[i].size() != 0 && grafo[i+1].size() != 0){
  57.             grafo[i].push_back({i+1, 1});
  58.             grafo[i+1].push_back({i, 1});
  59.         }
  60.     }
  61.  
  62.     int resp1=INF, resp2=INF, resp;
  63.     if(grafo[ini*2-1].size() != 0){
  64.         memset(dist, INF, sizeof dist);
  65.         bfs01(ini*2-1);
  66.         resp1 = min(dist[fim*2-1], dist[fim*2]);
  67.     }
  68.     if(grafo[ini*2].size() != 0){
  69.         memset(dist, INF, sizeof dist);
  70.         bfs01(ini*2);
  71.         resp2 = min(dist[fim*2-1], dist[fim*2]);
  72.     }
  73.  
  74.     resp = min(resp1, resp2);
  75.  
  76.     if(resp == INF){
  77.         printf("-1");
  78.         return 0;
  79.     }
  80.  
  81.     printf("%d", (resp+1)*p);
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment