mr_dot_convict

2034-Caravans-Timus-mr.convict

Jun 3rd, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. #include         <bits/stdc++.h>
  9. #pragma GCC      optimize ("Ofast")
  10. #pragma GCC      optimize ("unroll-loops")
  11. #pragma GCC      target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
  12.  
  13. #define IOS      ios_base::sync_with_stdio(false); cin.tie (nullptr)
  14. #define PREC     cout.precision (10); cout << fixed
  15. #define x        first
  16. #define y        second
  17. using namespace std;
  18.  
  19. const int N = (int)1e5 + 10;
  20. const int infi = (int)1e9;
  21.  
  22. int dr[N], ds[N];
  23. int n, m, sr, f, r;
  24. vector < vector <int> > Adj;
  25.  
  26. int bfs(int s, int t, int mid, int bs, int d[]) {
  27.     bool vis[N];
  28.     queue <int> q;
  29.  
  30.     fill (d, d + N, infi);
  31.     fill (vis, vis + N, false);
  32.     d[s] = 0, vis[s] = true;
  33.     if (bs && dr[s] <= mid) return d[t];
  34.     q.push(s);
  35.  
  36.     while (not q.empty()) {
  37.         int u = q.front();
  38.         q.pop();
  39.  
  40.         for (auto v : Adj[u]) {
  41.             if (bs && dr[v] <= mid) continue;
  42.             if (!vis[v]) {
  43.                 d[v] = d[u] + 1;
  44.                 vis[v] = true;
  45.                 q.push(v);
  46.             }
  47.         }
  48.     }
  49.     return d[t];
  50. }
  51.  
  52. void read() {
  53.     cin >> n >> m;
  54.     Adj.assign(n, vector <int>());
  55.     int u, v;
  56.     for (int e = 0; e < m; ++e) {
  57.         cin >> u >> v;
  58.         --u, --v;
  59.         Adj[u].push_back(v);
  60.         Adj[v].push_back(u);
  61.     }
  62.     cin >> sr >> f >> r;
  63.     --sr, --f, --r;
  64.     fill (dr, dr + N, infi);
  65.     fill (ds, ds + N, infi);
  66. }
  67.  
  68. void solve() {
  69.     bfs(sr, f, 0, 0, ds);
  70.     bfs(r, f, 0, 0, dr);
  71.     int len = ds[f];
  72.     int l = 0, h = n, mid;
  73.     while (l <= h) {
  74.         mid = (l + h)/2;
  75.         if (bfs(sr, f, mid, 1, ds) == len)
  76.             l = mid + 1;
  77.         else h = mid - 1;
  78.     }
  79.     cout << l << '\n';
  80. }
  81.  
  82. signed main() {
  83.     read();
  84.     solve();
  85.     return EXIT_SUCCESS;
  86. }
Add Comment
Please, Sign In to add comment