Advertisement
K_Y_M_bl_C

Untitled

Oct 15th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. //#define _GLIBCXX_DEBUG
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8. typedef pair<int, int> pii;
  9. typedef vector<int> vi;
  10. typedef long double ld;
  11.  
  12. #define mk make_pair
  13. #define inb push_back
  14. #define X first
  15. #define Y second
  16. #define all(v) v.begin(), v.end()
  17. #define sqr(x) (x) * (x)
  18. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  19. #define y1 AYDARBOG
  20. //continue break pop_back return scanf
  21.  
  22. int solve();
  23.  
  24. int main()
  25. {
  26.     //ios_base::sync_with_stdio(0);
  27.     //cin.tie(0);
  28. #define TASK ""
  29. #ifndef _DEBUG
  30.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  31. #endif
  32.     solve();
  33. #ifdef _DEBUG
  34.     fprintf(stderr, "\nTIME: %.3f\n", TIME);
  35. #endif
  36. }
  37.  
  38. const int BUFSZ = (int)1e5 + 7;
  39. char buf[BUFSZ];
  40. string get_str()
  41. {
  42.     scanf(" %s", buf);
  43.     return string(buf);
  44. }
  45.  
  46. const int M = 1e5 + 5;
  47.  
  48. int n, m, s, f, k, VAL;
  49. vector<int> g[M];
  50. int was[M], us[M];
  51.  
  52. int bfs()
  53. {
  54.     queue<int> q;
  55.     us[s] = 1;
  56.     q.push(s);
  57.     while(q.size())
  58.     {
  59.         int v = q.front();
  60.         q.pop();
  61.         for(auto to : g[v])
  62.             if (!us[to])
  63.             {
  64.                 us[to] = us[v] + 1;
  65.                 q.push(to);
  66.             }
  67.     }
  68.     return us[f];
  69. }
  70.  
  71. bool dfs(int x)
  72. {
  73.     queue<int> q;
  74.     q.push(k);
  75.     for(int i = 1; i <= n; ++i) was[i] = 0;
  76.     was[k] = 1;
  77.     while(q.size())
  78.     {
  79.         int v = q.front();
  80.         q.pop();
  81.         for(auto to : g[v])
  82.             if (!was[to] && was[v] + 1 <= x + 1)
  83.             {
  84.                 was[to] = was[v] + 1;
  85.                 q.push(to);
  86.             }
  87.     }
  88.     for(int i = 1; i <= n; ++i) us[i] = 0;
  89.     if (!was[s]) us[s] = 1, q.push(s);
  90.     while(q.size())
  91.     {
  92.         int v = q.front();
  93.         q.pop();
  94.         for(auto to : g[v])
  95.             if (!us[to] && !was[to])
  96.             {
  97.                 us[to] = us[v] + 1;
  98.                 q.push(to);
  99.             }
  100.     }
  101.     return (us[f] != VAL);
  102. }
  103.  
  104. int solve()
  105. {
  106.     scanf("%d%d", &n, &m);
  107.     for(int i = 0, a, b; i < m; ++i)
  108.     {
  109.         scanf("%d%d", &a, &b);
  110.         g[a].inb(b);
  111.         g[b].inb(a);
  112.     }
  113.     scanf("%d%d%d", &s, &f, &k);
  114.     VAL = bfs();
  115.     int l = 0, r = n;
  116.     while(l < r)
  117.     {
  118.         int mid = (l + r) >> 1;
  119.         if (dfs(mid)) r = mid;
  120.         else l = mid + 1;
  121.     }
  122.     printf("%d\n", l);
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement