Advertisement
K_Y_M_bl_C

Untitled

Oct 15th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.79 KB | None | 0 0
  1. /*
  2. ID: wtfalex2
  3. LANG: C++14
  4. PROB: castle
  5. //9cz2b944
  6. */
  7. #define _CRT_SECURE_NO_WARNINGS
  8. #pragma comment(linker, "/STACK:259000000")
  9.  
  10. #include <iostream>
  11. #include <cstdio>
  12. #include <cmath>
  13. #include <vector>
  14. #include <ctime>
  15. #include <map>
  16. #include <set>
  17. #include <string>
  18. #include <queue>
  19. #include <deque>
  20. #include <cassert>
  21. #include <cstdlib>
  22. #include <bitset>
  23. #include <algorithm>
  24. #include <string>
  25. #include <list>
  26. #include <fstream>
  27. #include <cstring>
  28. #include <climits>
  29. #include <stack>
  30. #include <unordered_map>
  31. #include <unordered_set>
  32.  
  33. using namespace std;
  34.  
  35. typedef unsigned long long ull;
  36. typedef long long ll;
  37. typedef pair<int, int> pii;
  38. typedef vector<int> vi;
  39. typedef pair<string, int> psi;
  40. typedef vector<string> vs;
  41. typedef pair<ll, ll> pll;
  42. typedef vector<ll> vll;
  43. typedef vector<char> vc;
  44. typedef vector<pii> vpii;
  45. typedef vector<pair<ll, ll> > vpll;
  46. typedef long double ld;
  47.  
  48. #define forn(i, n) for (int i = 0; i < (int)n; i++)
  49. #define for1(i, n) for (int i = 1; i <= (int)n; i++)
  50. #define forq(i, s, t) for (int i = s; i <= t; i++)
  51. #define ford(i, s, t) for (int i = s; i >= t; i--)
  52. #define mk make_pair
  53. #define inb push_back
  54. #define outb pop_back
  55. #define all(v) v.begin(), v.end()
  56. #define X first
  57. #define Y second
  58. #define TIME clock() * 1.0 / CLOCKS_PER_SEC
  59. #define sqr(x) (x) * (x)
  60. //#define double long double
  61. #define y1 amdknkgsdaasdwapgnpikn
  62. //
  63. #define mp make_pair
  64. #define pb push_back
  65. #define XX first
  66. #define YY second
  67. //
  68.  
  69. const ld EPS = 1e-9;
  70. const ld pi = acos(-1.0);
  71.  
  72. const int MAXN = (int)1e5 + 7;
  73. const ll INF = 2e9 + 7;
  74. const ll LINF = (ll)7e18;
  75. const ll MOD = (ll)1e9 + 7;
  76. const int CHASH = (ll)239017;
  77. const ld DINF = (ld)1000000000000000.0;
  78.  
  79. void mkfile();
  80. int solve();
  81.  
  82. int main()
  83. {
  84. #define TASK "rblock"
  85. #ifdef _DEBUG
  86. mkfile();
  87. freopen("input.txt", "r", stdin);
  88. freopen("output.txt", "w", stdout);
  89. freopen("test.txt", "w", stderr);
  90. ld tstart = TIME;
  91. srand(2299);
  92. #else
  93. //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  94. //freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout), freopen("test.txt", "w", stderr);
  95. srand(2299);
  96. #endif
  97. solve();
  98. #ifdef _DEBUG
  99. ld tend = TIME;
  100. cerr << tend - tstart << " s.\n";
  101. #endif
  102. return 0;
  103. }
  104.  
  105. void mkfile()
  106. {
  107. freopen("input.txt", "a+", stdout);
  108. srand(time(0));
  109. return;
  110. }
  111.  
  112. bool equal(double a, double b)
  113. {
  114. return abs(a - b) < EPS;
  115. }
  116.  
  117. int n, m, s, f, r;
  118. int ds[MAXN], d[MAXN], dp[MAXN];
  119. vi gs[MAXN], g[MAXN];
  120. int was[MAXN];
  121.  
  122. void bfss()
  123. {
  124. queue<int> q;
  125. q.push(s);
  126. ds[s] = 0;
  127. while (!q.empty())
  128. {
  129. int u = q.front();
  130. q.pop();
  131. for (auto to : gs[u])
  132. {
  133. if (ds[to] == INF)
  134. {
  135. ds[to] = ds[u] + 1;
  136. q.push(to);
  137. }
  138. }
  139. }
  140. }
  141.  
  142. void dfsup(int u)
  143. {
  144. was[u] = 1;
  145. for (auto to : gs[u])
  146. {
  147. if (ds[u] - 1 == ds[to])
  148. {
  149. g[u].inb(to);
  150. g[to].inb(u);
  151. if (!was[to])
  152. dfsup(to);
  153. }
  154. }
  155. }
  156.  
  157. void bfsr()
  158. {
  159. queue<int> q;
  160. q.push(r);
  161. was[r] = 1;
  162. d[r] = 0;
  163. while (!q.empty())
  164. {
  165. int u = q.front();
  166. q.pop();
  167. for (auto to : gs[u])
  168. {
  169. if (!was[to])
  170. {
  171. d[to] = d[u] + 1;
  172. was[to] = 1;
  173. q.push(to);
  174. }
  175. }
  176. }
  177. }
  178.  
  179. void calcdp()
  180. {
  181. queue<int> q;
  182. q.push(s);
  183. was[s] = 1;
  184. while (!q.empty())
  185. {
  186. int u = q.front();
  187. q.pop();
  188. int mxval = -1;
  189. int f = 0;
  190. for (auto to : g[u])
  191. {
  192. if (ds[to] + 1 == ds[u])
  193. {
  194. mxval = max(mxval, dp[to]);
  195. f = 1;
  196. }
  197. if (ds[to] - 1 == ds[u])
  198. {
  199. if (!was[to])
  200. {
  201. was[to] = 1;
  202. q.push(to);
  203. }
  204. }
  205. }
  206. if (f)
  207. dp[u] = min(mxval, dp[u]);
  208. }
  209. }
  210.  
  211. int solve()
  212. {
  213. scanf("%d %d", &n, &m);
  214. forn(i, m)
  215. {
  216. int x, y;
  217. scanf("%d %d", &x, &y);
  218. --x, --y;
  219. gs[x].inb(y), gs[y].inb(x);
  220. }
  221. scanf("%d %d %d", &s, &f, &r);
  222. --s, --f, --r;
  223. fill(ds, ds + n, INF);
  224. fill(d, d + n, INF);
  225. bfss();
  226. memset(was, 0, sizeof(was));
  227. dfsup(f);
  228. memset(was, 0, sizeof(was));
  229. bfsr();
  230. memset(was, 0, sizeof(was));
  231. forn(i, n)
  232. dp[i] = d[i];
  233. calcdp();
  234. printf("%d\n", dp[f]);
  235. return 0;
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement