Sunlight9

dfs找所有路径

Nov 27th, 2025
500
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // 全局变量说明:
  5. // t = 终点
  6. // adj = 邻接表,adj[u] 存储与 u 相邻的所有顶点
  7. // vis = 标记数组,防止路径中重复访问同一顶点(避免走回头路)
  8. // path = 当前 DFS 正在走的路径
  9. // record = 存储所有从 s 到 t 的路径
  10. int t;
  11. vector<vector<int> > adj;
  12. vector<bool> vis;
  13. vector<int> path;
  14. vector<vector<int> > record;
  15.  
  16. // 深度优先搜索,寻找从 u 到 t 的所有简单路径
  17. void dfs(int u) {
  18.  
  19.     // 如果当前点 u 就是目标点 t
  20.     // 说明 path 保存了一条完整路径
  21.     if (u == t) {
  22.         record.push_back(path);   // 把当前整条路径保存下来
  23.         return;                   // 返回上一层继续搜索别的路径
  24.     }
  25.  
  26.     // 枚举从 u 出发的所有邻接点 v
  27.     for (int i = 0; i < adj[u].size(); ++i) {
  28.         int v = adj[u][i];
  29.  
  30.         // 如果 v 未在当前路径中出现(避免重复)
  31.         if (!vis[v]) {
  32.  
  33.             // 选择:走向 v
  34.             vis[v] = true;        // 标记 v 已经在当前路径中
  35.             path.push_back(v);    // 把 v 加入路径
  36.            
  37.             dfs(v);               // 递归搜索从 v 出发的所有路径
  38.  
  39.             // 回溯:撤销选择
  40.             vis[v] = false;       // 取消标记,允许其他路径再次访问 v
  41.             path.pop_back();      // 从当前路径中弹出 v
  42.         }
  43.     }
  44. }
  45.  
  46. int main() {
  47.     ios::sync_with_stdio(false);
  48.     cin.tie(nullptr);
  49.  
  50.     int n, m, s;
  51.     cin >> n >> m >> s >> t;   // 输入点数、边数、起点 s 和终点 t
  52.  
  53.     adj.resize(n + 1);         // 邻接表初始化为 n 个点(1 开始编号)
  54.     vis.resize(n + 1);         // 访问标记初始化为 n 个点(默认全为 false)
  55.  
  56.     // 输入图的边(无向图:双向加入邻接表)
  57.     for (int i = 1; i <= m; ++i) {
  58.         int u, v;
  59.         cin >> u >> v;
  60.         adj[u].push_back(v);   // u → v
  61.         adj[v].push_back(u);   // v → u
  62.     }
  63.  
  64.     // 初始化 DFS 起点
  65.     path.push_back(s);         // 路径中加入起点
  66.     vis[s] = true;             // 起点标记为已访问
  67.     dfs(s);                    // 从 s 出发进行深度优先搜索
  68.  
  69.     // 输出所有找到的路径
  70.     for (int i = 0; i < record.size(); ++i) {
  71.         for (int j = 0; j < record[i].size(); ++j) {
  72.             cout << record[i][j] << " ";
  73.         }
  74.         cout << "\n";
  75.     }
  76.  
  77.     return 0;
  78. }
  79.  
Advertisement
Comments
  • User was banned
Add Comment
Please, Sign In to add comment