RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 601140
Accepted
yrHeTateJlb
yrHeTateJlb
Asked:2020-12-08 21:19:08 +0000 UTC2020-12-08 21:19:08 +0000 UTC 2020-12-08 21:19:08 +0000 UTC

将父子对转换为路由

  • 772

我需要在无向未加权图上找到从每个人到每个人的最短路径。经过一番谷歌搜索后,我发现了 Dijkstra 算法。该算法的输出类似于QMap<int, int>。第一个int是父节点,第二个是最短路径中的后继节点。

例如,如果您在这样的图中寻找从零开始的顶点路径:

图形

我会得到这个集合:
0 - 0
1 - 0
2 - 3
3 - 1
4 - 1

现在的问题是如何有效地将其转换为路径?

现在我这样做:

//Поиск родителя
QMap<int, int>::ConstIterator findParent(const QMap<int, int> &map,
                                         int child){
    QMap<int, int>::ConstIterator parent = map.find(child);

    if(child == *parent){
        return map.end();
    }

    return parent;
}
//-----------------------------------------------------------------------
//Построение маршрута
QVector<int> route(const QMap<int, int> &map,
                   int start){
    QVector<int> route;
    route.append(start);

    forever{
        QMap<int, int>::ConstIterator parent = findParent(map, route.last());

        if(parent == map.end()){
            break;
        }

        route.append(*parent);
    };

    return route;
}
//-----------------------------------------------------------------------
//Построение маршрутов
QVector<QVector<int> > routes(const QMap<int, int> &map){
    QVector<QVector<int> > routes;
    QMap<int, int>::ConstIterator begin = map.begin();
    QMap<int, int>::ConstIterator end = map.end();

    for(; begin != end; ++begin){
        routes.append(route(map, begin.key()));
    }

    return routes;
}

它可以工作,甚至可以正常工作。但我怀疑这是最有效的方法。我多次在地图中寻找相同的值。也许有可能以某种方式在一次通过QMap<int, int>中构建路由,或者在执行算法时立即构建路由?

一个最小的例子,如果突然有人需要它

c++
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Zealint
    2020-12-08T21:50:01Z2020-12-08T21:50:01Z

    这里最有效的方法是从叶到根遍历树。为此,您首先需要将散列转换为数组。也就是会有这样一个p值的数组p[] = {0, 0, 3, 1, 1}。这非常方便,因为多次遍历数组非常快,条件i==p[i]意味着我们已经到达起点。

    此外,为了构建一条路径,比如说,到顶部x,您只需要沿着树走直到我们找到根。示例伪代码:

    x = желаемая_вершина;
    do {
      way[k++] = x;
      x = p[x];
    } while (x!=p[x]);
    

    该数组way将包含所需的向后路径。您需要为所有x需要找到路径的对象运行此循环。您的实施中的刹车主要是由于树的存储效率低下,而不是因为某些部分被多次通过。使用相同的方法,刹车不太可能。好吧,除非你有数万个顶点。

    另一个注意事项。Dijkstra 的算法在这里效率低下,它在加权图中搜索路径,在非加权图中搜索最短路径的一种更快的方法是广度优先搜索。如果你仍然想要 Dijkstra,那么优化路径的恢复是没有意义的,因为刹车将在 Dijkstra 中。

    • 6

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5