Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- #include <queue>
- using namespace std;
- typedef pair<int, int> vertex;
- int inf = 2000000000;
- vector<vector<int> > d;
- int v1, v2, v3;
- void fix_path(queue<vertex>& q, vector<vector<int> >& c, vector<vector<int> >& d, int v1, int v2, int d2)
- {
- if(c[v1][v2] == 0)q.push(vertex(v1,v2));
- c[v1][v2] = 1;
- d[v1][v2] = d2;
- }
- void bfs(int si, int sj)
- {
- vector<vector<int> > c(v1 + 1, vector<int>(v2 + 1));
- c[si][sj] = 1;
- d[si][sj] = 0;
- queue<vertex> q;
- q.push(vertex(si, sj));
- while(!q.empty())
- {
- int cv1 = q.front().first, cv2 = q.front().second;
- q.pop();
- if(cv1 < v1 && d[v1][cv2] > d[cv1][cv2] + 1)
- fix_path(q, c, d, v1, cv2, d[cv1][cv2] + 1);
- if(cv2 < v2 && d[cv1][v2] > d[cv1][cv2] + 1)
- fix_path(q, c, d, cv1, v2, d[cv1][cv2] + 1);
- if(cv1 > 0 && d[0][cv2] > d[cv1][cv2] + 1)
- fix_path(q, c, d, 0, cv2, d[cv1][cv2] + 1);
- if(cv2 > 0 && d[cv1][0] > d[cv1][cv2] + 1)
- fix_path(q, c, d, cv1, 0, d[cv1][cv2] + 1);
- if(cv1 > 0 && cv2 < v2)
- {
- int nv2 = min(cv2 + cv1, v2);
- int nv1 = cv1 - (nv2 - cv2);
- if(d[nv1][nv2] > d[cv1][cv2] + 1)
- fix_path(q, c, d, nv1, nv2, d[cv1][cv2] + 1);
- }
- if(cv2 > 0 && cv1 < v1)
- {
- int nv1 = min(cv2 + cv1, v1);
- int nv2 = cv2 - (nv1 - cv1);
- if(d[nv1][nv2] > d[cv1][cv2] + 1)
- fix_path(q, c, d, nv1, nv2, d[cv1][cv2] + 1);
- }
- }
- }
- int main()
- {
- cin >> v1 >> v2 >> v3;
- d.resize(v1 + 1, vector<int>(v2 + 1, inf));
- bfs(0, 0);
- int r = inf;
- for(int i = 0; i <= v1; i++)
- if(d[i][v3] < r) r = d[i][v3];
- for(int i = 0; i <= v2; i++)
- if(d[v3][i] < r) r = d[v3][i];
- cout << (r == inf ? 0 : r) << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment