fork(2) download
  1. //Түвшний нэвтрэлт. BFS
  2. #include <queue>
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int n, m; // оройн тоо, ирмэгийн тоо
  7. bool vis[50000]; // ирсэн ирээгүйг хадгалах массив.
  8. vector<int> adj[50000]; // графын мэдээллийг хадгалах вектор.
  9. queue< pair<int,int> > q; // bfs явах queue
  10.  
  11. int main() {
  12. cin >> n >> m; // орой, ирмэгийн тоонуудыг унших.
  13.  
  14. for(int i = 1; i <= m; i++) {
  15. int u, v; // i-р ирмэгийг тодорхойлох 2 орой.
  16. // u болон v орой холбогддог гэсэн утгатай тул
  17. cin >> u >> v;
  18. adj[u].push_back( v );
  19. adj[v].push_back( u );
  20. }
  21. int x, y; // x-ээс y хүртэл
  22.  
  23. cin >> x >> y; // хүсэлтээ унших
  24.  
  25. q.push( make_pair( x, 0 ) ); // анх x оройдээр 0 утгаар
  26.  
  27. while( !q.empty() ) { // хоосон биш л бол үргэлжилнэ.
  28. int nowU = q.front().first; // одоо явж байгаа орой.
  29. int nowW = q.front().second; // одоо явж байгаа оройн түвшин
  30.  
  31. vis[nowU] = 1; // nowU оройг ирсэн гэж тэмдэглэнэ.
  32.  
  33. if( nowU == y ) {
  34. // nowU орой нь бидний хайсан Y орой бол энэ хүрээд зогсоно.
  35. cout << nowW << endl; // хамгйин бага зардал.
  36. return 0; // программыг зогсоож болно гэсэн үг юм.
  37. }
  38.  
  39. q.pop(); // дараагийн элемэнтээс явах ёстой тул үүнийг устгана.
  40.  
  41. for(int i = 0; i < adj[nowU].size(); i++) {
  42. int v = adj[nowU][i]; // одоо байгаа оройтой шууд ирмэгээр холбогдсон орой.
  43. if( !vis[v] ) { // v орой тэмдэглэгдээгүй бол очиж ёстой.
  44. q.push( make_pair( v, nowW+1 ) ); // энэ оройдээр одоо байгаа
  45. // түвшиндээр нэмэх нь 1-ээр ирнэ.
  46. }
  47. }
  48. }
  49. cout << "Ochih bolomjgui!\n"; // хэрвээ бүрэн зогсоогүй бол очиж
  50. // чадаагүй буюу очих боломжгүй гэсэн үг.
  51. return 0;
  52. }
Success #stdin #stdout 0s 4372KB
stdin
4 4
1 2
2 3
3 4
2 4
1 4
stdout
2