Advertisement
Guest User

Untitled

a guest
Dec 13th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1e5+7;
  8. int m, n, q, a, b, f, g, k;
  9.  
  10. vector <int> G[N];
  11. int dist1[N];
  12. int dist2[N];
  13. int odwiedzony1[N];
  14. int odwiedzony2[N];
  15. int odwiedzony[N];
  16.  
  17. int BFS(int v, int u)
  18. {
  19.     for(int i = 1; i <= n; i++)
  20.     {
  21.         dist1[i]=N;
  22.         dist2[i]=N;
  23.         odwiedzony1[i]=0;
  24.         odwiedzony2[i]=0;
  25.     }
  26.    
  27.     dist1[v]=0;
  28.     dist2[u]=0;
  29.    
  30.     queue<int> xd;
  31.     queue<int> lol;
  32.    
  33.     odwiedzony1[v]=true;
  34.     odwiedzony2[u]=true;
  35.    
  36.     xd.push(v);
  37.     lol.push(u);
  38.    
  39.     while(!xd.empty() || !lol.empty())
  40.     {
  41.         if(!xd.empty())
  42.         {
  43.             f = xd.front();
  44.             xd.pop();
  45.             odwiedzony1[f] = true;
  46.             if(odwiedzony2[f ]== 1)
  47.             {
  48.                 return dist1[f] + dist2[f];
  49.             }
  50.            
  51.             for(int i=0;i<G[f].size();i++)
  52.             {
  53.                 if(dist1[f]+1<dist1[G[f][i]])
  54.                 {
  55.                     dist1[G[f][i]]=dist1[f]+1;
  56.                     xd.push(G[f][i]);
  57.                    
  58.                 }
  59.             }
  60.         }
  61.        
  62.         if(!lol.empty())
  63.         {
  64.             g = lol.front();
  65.             lol.pop();
  66.             odwiedzony2[g] = true;
  67.             if(odwiedzony1[g]== 1)
  68.             {
  69.                 return dist1[g] + dist2[g];
  70.             }
  71.            
  72.             for(int i=0;i<G[g].size();i++)
  73.             {
  74.                 if(dist2[g]+1<dist2[G[g][i]])
  75.                 {
  76.                     dist2[G[g][i]]=dist2[g]+1;
  77.                     xd.push(G[g][i]);
  78.                 }
  79.             }
  80.         }
  81.     }
  82.    
  83.     return 2137;
  84. }
  85.  
  86. void DFS (int v)
  87. {
  88.     odwiedzony[v]=k;
  89.     for(int i=0;i<G[v].size();i++)
  90.     {
  91.         if(!odwiedzony[G[v][i]])
  92.         {
  93.             DFS(G[v][i]);
  94.         }
  95.        
  96.     }
  97. }
  98.        
  99. int main()
  100. {
  101.     ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0);
  102.    
  103.     cin >> m >> n >> q;
  104.    
  105.     for(int i = 0; i < n; i++)
  106.     {
  107.         cin >> a >> b;
  108.         G[a].push_back(b);
  109.         G[b].push_back(a);
  110.     }
  111.    
  112.     k++;
  113.    
  114.     for(int i=1; i<=n; i++)
  115.       {
  116.           if(odwiedzony[i]==0)
  117.           {
  118.               DFS(i);
  119.               k++;
  120.           }
  121.       }
  122.    
  123.     for(int i = 0; i < q; i++)
  124.     {
  125.        
  126.         cin >> a >> b;
  127.         if(odwiedzony[a] != odwiedzony[b]) cout<<"-1\n";
  128.         else cout << BFS(a,b) << '\n';
  129.        
  130.     }
  131.     return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement