Advertisement
double_trouble

Untitled

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