Advertisement
double_trouble

Untitled

Nov 14th, 2016
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <string>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <set>
  9.  
  10. using namespace std;
  11.  
  12. vector<vector<int> > g1, g2;
  13. int f = 0;
  14. int a, b;
  15. long long sz;
  16. vector<long long> dist1, dist2, dist3;
  17.  
  18. void dfs1(int v, int p,  long long s)
  19. {
  20.     //used[v] = 1;
  21.     dist1[v] = min(dist1[v], s);
  22.     for (int i = 0; i < g2[v].size() ; i++)
  23.     {
  24.         int to = g2[v][i];
  25.         if (to != p && dist1[v] + 1 < dist1[to])
  26.             dfs1(to, v, s + 1);
  27.     }
  28. }
  29.  
  30. void dfs2(int v, int p, long long s)
  31. {
  32.     //used[v] = 1;
  33.     dist2[v] = min(dist2[v], s);
  34.     for (int i = 0; i < g1[v].size(); i++)
  35.     {
  36.         int to = g1[v][i];
  37.         if (to != p && dist2[v] + 1 < dist2[to])
  38.             dfs2(to, v, s + 1);
  39.     }
  40. }
  41.  
  42. void dfs3(int v, int p, long long s)
  43. {
  44.     //used[v] = 1;
  45.     dist3[v] = min(dist3[v], s);
  46.     for (int i = 0; i < g1[v].size(); i++)
  47.     {
  48.         int to = g1[v][i];
  49.         if (to != p && dist3[v] + 1 < dist3[to])
  50.             dfs3(to, v, s + 1);
  51.     }
  52. }
  53.  
  54. int main()
  55. {
  56.     int n, m;
  57.     cin >> n >> m;
  58.     cin >> a >> b;
  59.  
  60.     g1.resize(n + 1);
  61.     g2.resize(n + 1);
  62.     int x, y;
  63.     for (int i = 0; i < m; i++)
  64.     {
  65.         cin >> x >> y;
  66.         g1[y].push_back(x);
  67.         g2[x].push_back(y);
  68.     }
  69.  
  70.     long long ans = 1e18;
  71.     //used.assign(n + 1, 0);
  72.     dist1.assign(n + 1, n * n);
  73.     dist2.assign(n + 1, n * n);
  74.     dist3.assign(n + 1, n * n);
  75.     dfs1(0, -1, 0);
  76.     //used.assign(n + 1, 0);
  77.     dfs2(a, -1, 0);
  78.     //used.assign(n + 1, 0);
  79.     dfs3(b, -1, 0);
  80.  
  81.     for (int i = 0; i <= n; i++)
  82.         ans = min(ans, dist1[i] + dist2[i] + dist3[i]);
  83.  
  84.     cout << ans << endl;
  85.  
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement