微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在两个相邻节点之间具有多条边的图中查找所有可能的路径

如何解决在两个相邻节点之间具有多条边的图中查找所有可能的路径

我有这张图: Graph with 3 nodes and 5 edges

我有由此产生的邻接矩阵:

[0,2,1]
[2,2]
[1,0]

将邻接矩阵转换为图后:

{0: [1,2],1: [0,2: [0,1]}

我试过这个代码

    def find_all_paths(graph,start,end,path=[]):
    path = path + [start]
    if start == end:
        return [path]
    if start not in graph:
        return []
    paths = []
    for node in graph[start]:
        if node not in path:
            newpaths = find_all_paths(graph,node,path)
            for newpath in newpaths:
                paths.append(newpath)
    return paths

我得到了这个路径:

[1,3]
[1,3]

我正在努力实现并且无法绕开的目标是实现这样的目标:

['e','ac','ad','bc','bd']

或者:

[['e'],['a','c'],'d'],['b','d']]

问题似乎是这个函数在两个相邻节点之间有多个边的图上不能正常工作。

我应该得到 5 条路径,而不是 2 条。

我从图中生成一个邻接矩阵,如下所示:

['','ab','e']
['ab','','cd']
['e','cd','']

并将其转换为图形:

{0: [{1: 'ab'},{2: 'e'}],1: [{0: 'ab'},{2: 'cd'}],2: [{0: 'e'},{1: 'cd'}]}

但我只是不明白我应该如何修改 find_all_pahts 函数以能够生成我上面描述的路径。 有人知道怎么做吗?

解决方法

您可以多次运行 find_all_paths 以获取多条边提供的额外路径

伪代码:

2021-07-02 16:55:54.041 7172-7200/com.example.passivedata E/AndroidRuntime: FATAL EXCEPTION: DefaultDispatcher-worker-1
Process: com.example.passivedata,PID: 7172
java.lang.NullPointerException: Attempt to invoke interface method 'boolean com.google.common.util.concurrent.ListenableFuture.cancel(boolean)' on a null object reference
    at android.os.Parcel.createExceptionOrNull(Parcel.java:2392)
    at android.os.Parcel.createException(Parcel.java:2370)
    at android.os.Parcel.readException(Parcel.java:2353)
    at android.os.Parcel.readException(Parcel.java:2295)
    at androidx.health.services.client.impl.IPassiveMonitoringApiService$Stub$Proxy.registerDataCallback(IPassiveMonitoringApiService.java:318)
    at androidx.health.services.client.impl.ServiceBackedPassiveMonitoringClient$registerDataCallbackInternal$serviceOperation$1.execute(ServiceBackedPassiveMonitoringClient.kt:122)
    at androidx.health.services.client.impl.ipc.Client$3.execute(Client.java:222)
    at androidx.health.services.client.impl.ipc.internal.ServiceConnection.execute(ServiceConnection.java:243)
    at androidx.health.services.client.impl.ipc.internal.ServiceConnection.enqueue(ServiceConnection.java:200)
    at androidx.health.services.client.impl.ipc.internal.ConnectionManager.handleMessage(ConnectionManager.java:123)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:223)
    at android.os.HandlerThread.run(HandlerThread.java:67)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。