Iamtui1010

dfs.cpp

Jul 28th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3.  
  4. #define long long long
  5. #define nln '\n'
  6.  
  7. using namespace std;
  8.  
  9. long n, m, s, t;
  10. vector<vector<long>> a;
  11. vector<bool> crs;
  12.  
  13. void input()
  14. {
  15.     freopen("dfs.inp", "r", stdin);
  16.     //freopen("dfs.out", "w", stdout);
  17.     cin.tie(0)->sync_with_stdio(0);
  18.     cout.tie(0)->sync_with_stdio(0);
  19.     cin >> n >> m >> s >> t;
  20.     a.resize(n+1);
  21.     crs.resize(n+1, 0); // 0 la flase, 1 la true
  22.     for (long i = 1; i <= m; ++i){
  23.         long x, y;
  24.         cin >> x >> y;
  25.         a[x].push_back(y);
  26.         a[y].push_back(x);
  27.     }
  28. }
  29.  
  30. long cnt = 0, miv = 1000000;
  31.  
  32. void dfs(long u)
  33. {
  34.     if (u == t){
  35.         if (cnt < miv)
  36.             miv = cnt;
  37.         return;
  38.     }
  39.     // Nếu đã đến được đỉnh mục tiêu thì xét xem con đường này đã là ngắn nhất chưa
  40.  
  41.     for (const auto &i : a[u]){
  42.         // Tìm các đỉnh kề đỉnh u để đi
  43.         // Nếu chưa có thì đi qua và đánh dấu là đã qua, để trên con đường này không đi lại đỉnh đó nữa
  44.         // Sau đó tăng biến cnt là độ dài hay năng lượng tiêu hao trên con đường
  45.         if (!crs[i]){
  46.             crs[i] = 1;
  47.             ++cnt;
  48.             dfs(i); // đi vào đỉnh i
  49.             --cnt;
  50.             crs[i] = 0;
  51.             // sau khi đi qua đỉnh i ta giảm biến cnt đi 1 và đánh dấu là chưa đi qua đỉnh i để đi đường khác
  52.         }
  53. }
  54.  
  55. int main()
  56. {
  57.     input();
  58.     dfs(s);
  59.     cout << miv << nln;
  60.     // in ra kết quả là năng lượng tiêu hao của con đường ngắn nhất từ đỉnh đầu đến đỉnh cuối
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment