frp

2690

frp
Feb 12th, 2012
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <queue>
  5. using namespace std;
  6. typedef pair<int, int> vertex;
  7. int inf = 2000000000;
  8. vector<vector<int> > d;
  9. int v1, v2, v3;
  10. void fix_path(queue<vertex>& q, vector<vector<int> >& c, vector<vector<int> >& d, int v1, int v2, int d2)
  11. {
  12.     if(c[v1][v2] == 0)q.push(vertex(v1,v2));
  13.     c[v1][v2] = 1;
  14.     d[v1][v2] = d2;
  15. }
  16. void bfs(int si, int sj)
  17. {
  18.     vector<vector<int> > c(v1 + 1, vector<int>(v2 + 1));
  19.     c[si][sj] = 1;
  20.     d[si][sj] = 0;
  21.     queue<vertex> q;
  22.     q.push(vertex(si, sj));
  23.     while(!q.empty())
  24.     {
  25.         int cv1 = q.front().first, cv2 = q.front().second;
  26.         q.pop();
  27.         if(cv1 < v1 && d[v1][cv2] > d[cv1][cv2] + 1)
  28.             fix_path(q, c, d, v1, cv2, d[cv1][cv2] + 1);
  29.         if(cv2 < v2 && d[cv1][v2] > d[cv1][cv2] + 1)
  30.             fix_path(q, c, d, cv1, v2, d[cv1][cv2] + 1);
  31.         if(cv1 > 0 && d[0][cv2] > d[cv1][cv2] + 1)
  32.             fix_path(q, c, d, 0, cv2, d[cv1][cv2] + 1);
  33.         if(cv2 > 0 && d[cv1][0] > d[cv1][cv2] + 1)
  34.             fix_path(q, c, d, cv1, 0, d[cv1][cv2] + 1);
  35.         if(cv1 > 0 && cv2 < v2)
  36.         {
  37.             int nv2 = min(cv2 + cv1, v2);
  38.             int nv1 = cv1 - (nv2 - cv2);
  39.             if(d[nv1][nv2] > d[cv1][cv2] + 1)
  40.                 fix_path(q, c, d, nv1, nv2, d[cv1][cv2] + 1);
  41.         }
  42.         if(cv2 > 0 && cv1 < v1)
  43.         {
  44.             int nv1 = min(cv2 + cv1, v1);
  45.             int nv2 = cv2 - (nv1 - cv1);
  46.             if(d[nv1][nv2] > d[cv1][cv2] + 1)
  47.                 fix_path(q, c, d, nv1, nv2, d[cv1][cv2] + 1);
  48.         }
  49.     }
  50. }
  51. int main()
  52. {
  53.     cin >> v1 >> v2 >> v3;
  54.     d.resize(v1 + 1, vector<int>(v2 + 1, inf));
  55.     bfs(0, 0);
  56.     int r = inf;
  57.     for(int i = 0; i <= v1; i++)
  58.         if(d[i][v3] < r) r = d[i][v3];
  59.     for(int i = 0; i <= v2; i++)
  60.         if(d[v3][i] < r) r = d[v3][i];
  61.     cout << (r == inf ? 0 : r) << '\n';
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment