当前位置: 首页 > 编程笔记 >

访问C ++中所有节点的最短路径

鄂坚
2023-03-14
本文向大家介绍访问C ++中所有节点的最短路径,包括了访问C ++中所有节点的最短路径的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个带有N个节点的无向连通图,这些节点被标记为0、1、2,...,N-1。图的长度将为N,并且仅当节点i和j连接时,j才与列表graph [i]中的i不完全相同。我们必须找到访问每个节点的最短路径的长度。我们可以在任何节点处开始和停止,可以多次访问节点,并且可以重用边缘。

因此,如果输入类似于[[1],[0,2,4],[1,3,4],[2],[1,2]],则输出将为4。路径为[0,1,4,2,3]。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个队列

  • n:=图的大小

  • 要求:= 2 ^(n-1)

  • 定义一张映射

  • 对于初始化i:= 0,当i <n时,更新(将i增加1),执行-

    • 将{0 OR(2 ^ i),i}插入q

  • 如果n与1相同,则-

    • 返回0

  • 对于初始化lvl:= 1,当非q为空时,更新(将lvl增加1),执行-

    • 定义一个数组curr = q的前元素

    • 从q删除元素

    • 对于初始化i:= 0,当i <graph [curr [1]]的大小时,更新(将i增加1),执行

    • 忽略以下部分,跳至下一个迭代

    • 返回lvl

    • u:= graph [curr [1],i]

    • newMask:=(curr [0]或2 ^ u)

    • 如果newMask与req相同,则-

    • 如果visited [u]的呼叫计数(newMask),则-

    • 将newMask插入访问过的网站[u]

    • 将{newMask,u}插入q

    • sz:= q的大小

    • 当sz为非零值时,请在每次迭代中将sz减1,然后执行-

    • 返回-1

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
       public:
       int shortestPathLength(vector<vector<int> >& graph){
          queue<vector<int> > q;
          int n = graph.size();
          int req = (1 << n) - 1;
          map<int, set<int> > visited;
          for (int i = 0; i < n; i++) {
             q.push({ 0 | (1 << i), i });
          }
          if (n == 1)
          return 0;
          for (int lvl = 1; !q.empty(); lvl++) {
             int sz = q.size();
             while (sz--) {
                vector<int> curr = q.front();
                q.pop();
                for (int i = 0; i < graph[curr[1]].size(); i++) {
                   int u = graph[curr[1]][i];
                   int newMask = (curr[0] | (1 << u));
                   if (newMask == req)
                      return lvl;
                   if (visited[u].count(newMask))
                   continue;
                   visited[u].insert(newMask);
                   q.push({ newMask, u });
                }
             }
          }
          return -1;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1},{0,2,4},{1,3,4},{2},{1,2}};
       cout << (ob.shortestPathLength(v));
    }

    输入值

    {{1},{0,2,4},{1,3,4},{2},{1,2}}

    输出结果

    4
     类似资料:
    • 我有一个加权和无向图,有顶点。其中两个顶点是和。 我需要找到最短的路径,从开始,在结束,并通过G的所有顶点(以任何顺序)。 如何做到这一点? 这不是旅行推销员问题:我不需要访问每个顶点一次,也不想回到第一个顶点。

    • 我试图解决一个问题,其中有一个带正加权边的无向图,我需要找到一个最短的路径,该路径正好覆盖所有节点,一旦给定了起始节点和结束节点。此外,图是完整的(每个节点都连接到图中的所有其他节点)。我已经试着寻找一个算法可以解决这个问题,但我还没有找到一个解决这个问题。由于起止节点的限制,这并不完全是旅游销售员的问题。我将感谢任何帮助。

    • 我有一张室内地图上的无向位置图。当给定一组顶点时,我要找到覆盖所有这些顶点的最短路径。图形包含52个顶点和150-250条边。 我能用什么最好的算法来找到最短的路径。请不要混淆这是一个旅行推销员的问题。它不需要覆盖所有节点,只需要覆盖给定的节点集。

    • 我正在使用NetworkX Python库。对我试图解决的问题的更广泛的描述在这里。 我想找到1)至少访问每个节点一次的有效路径和2)基于边权重的至少访问每个节点一次的最短路径。 这听起来像是旅行推销员问题的一个变种。另一个值得注意的是,图几乎是无向的——大多数节点是双向连接的,只有少数几个节点是双向连接的( 我研究了NetworkX算法,但似乎没有一个能满足这个问题。 用于生成图形的代码为: 这

    • 我需要帮助在一个未加权无向图中找到两个节点之间的所有最短路径。 我能够使用BFS找到一条最短路径,但到目前为止,我还不知道如何找到并打印出所有路径。 知道我可以使用的算法/伪代码吗?

    • 我确实有一个图(~250个节点)。要连接到一个节点,我必须用points->加权图购买它。有些节点总是被占用(“声明的节点”),我可以从这些节点开始连接到其他节点。此外,我的点数有限。所有节点都可以连接在一起。 有什么方法可以得到一个图,其中所有的节点都必须连接在一起,点最少?如果可能的话,以给定的最大点数。 第二)有没有一种方法可以使它不需要一个完全连通的图?例如:一个“必须有节点”的节点直接连