当前位置 博文首页 > 文章内容

    图的遍历

    作者: 栏目:未分类 时间:2020-07-10 16:04:32

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    广度优先搜索

    '广搜':以v为起始点,由近至远依次访问和v路径想通且路径长度为1,2,...的顶点
    '广搜'是一种分层的查找过程
    时间复杂度 O(n+m)
    
    空间复杂度 O(n)(vis 数组和队列)
    算法过程可以看做是图上'火苗传播的过程':最开始只有起点着火了,在每一时刻,有火的节点都向它相邻的所有节点传播火苗。
    

    void bfs(int u) {
      while (!Q.empty()) Q.pop();
      Q.push(u);
      vis[u] = 1;
      d[u] = 0;
      p[u] = -1;
      while (!Q.empty()) {
        u = Q.front();
        Q.pop();
        for (int i = head[u]; i; i = e[i].x) {
          if (!vis[e[i].t]) {
            Q.push(e[i].t);
            vis[e[i].t] = 1;
            d[e[i].t] = d[u] + 1;
            p[e[i].t] = u;
          }
        }
      }
    }
    void restore(int x) {
      vector<int> res;
      for (int v = x; v != -1; v = p[v]) {
        res.push_back(v);
      }
      std::reverse(res.begin(), res.end());
      for (int i = 0; i < res.size(); ++i) printf("%d", res[i]);
      puts("");
    }
    

    广度伪代码

    bfs(s) {
      q = new queue()
      q.push(s), visited[s] = true
      while (!q.empty()) {
        u = q.pop()
        for each edge(u, v) {
          if (!visited[v]) {
            q.push(v)
            visited[v] = true
          }
        }
      }
    }
    

    深度优先搜索

    所谓'深度优先',就是说每次都尝试向'更深的节点走'
    DFS 最显著的特征在于其 递归调用自身 。同时与 BFS 类似,DFS 会对其访问过的点打上'访问标记',
    在遍历图时跳过已打过标记的点,以确保 每个点仅访问一次 
    '时间复杂度' O(n+m)
    
    '空间复杂度' O(n)
    其中 n 表示点数,m表示边数,复杂度包含了栈空间,栈空间的空间复杂度是 O(n)
    

    void dfs(int u) {
      vis[u] = 1;
      for (int i = head[u]; i; i = e[i].x) {
        if (!vis[e[i].t]) {
          dfs(v);
        }
      }
    }