javascript - 流程图获取深度,求各位算法高手帮帮忙

查看:85
本文介绍了javascript - 流程图获取深度,求各位算法高手帮帮忙的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

最近这个问题困扰我半天,我有以下json数据

[
    {"prev_node": "0000000000000005","next_node": "0000000000000006"},
    {"prev_node": "0000000000000006","next_node": "0000000000000007"},
    {"prev_node": "0000000000000006","next_node": "0000000000000008"},
    {"prev_node": "0000000000000008","next_node": "0000000000000012"},
    {"prev_node": "0000000000000009","next_node": "0000000000000010"},
    {"prev_node": "0000000000000010","next_node": "0000000000000011"},
    {"prev_node": "0000000000000014","next_node": "0000000000000015"},
    {"prev_node": "0000000000000015","next_node": "0000000000000016"},
    {"prev_node": "0000000000000016","next_node": "0000000000000017"},
    {"prev_node": "0000000000000018","next_node": "0000000000000019"},
    {"prev_node": "0000000000000020","next_node": "0000000000000021"},
    {"prev_node": "0000000000000019","next_node": "0000000000000020"},
    {"prev_node": "0000000000000012","next_node": "0000000000000022"},
    {"prev_node": "0000000000000022","next_node": "0000000000000023"},
    {"prev_node": "0000000000000023","next_node": "0000000000000009"},
    {"prev_node": "0000000000000011","next_node": "0000000000000024"},
    {"prev_node": "0000000000000024","next_node": "0000000000000014"},
    {"prev_node": "0000000000000017","next_node": "0000000000000025"},
    {"prev_node": "0000000000000025","next_node": "0000000000000018"},
    {"prev_node": "0000000000000007","next_node": "0000000000000021"},
    {"prev_node": null,"next_node": "0000000000000005"},
    {"prev_node": "0000000000000021","next_node": null}
]

其中,prev_node代表上一个节点,next_node为下一节点.如果prev_node为Null,则代表当前为第一个节点.next_node为null为最后一个节点.根据数据得到以下流程图

求当前深度最深的流程有哪些节点,和流程的有几个分支

注:节点只能向下走

这个问题已被关闭,原因:问题已解决 - 问题已解决,且对他人无借鉴意义

解决方案

#!/usr/bin/python
# coding: utf-8


def build_graph(nodes=[]):
    graph = {}
    for node in nodes:
        if not node['prev_node']:      # root node
            if 'root' not in graph:
                graph['root'] = []
            graph['root'].append(node['next_node'])
        else:
            if node['prev_node'] not in graph:
                graph[node['prev_node']] = []
            if node['next_node']:
                graph[node['prev_node']].append(node['next_node'])
    return graph


def travel(node, graph={}):
    # print(node)
    if not graph[node]:
        return 1, [node]   # branch, node

    max_nodes = []
    max_branches = 0
    for i in graph[node]:
        branches, nodes = travel(i, graph)
        if len(nodes) > len(max_nodes):
            max_nodes = nodes
        max_branches += branches
    max_nodes.append(node)
    return max_branches, max_nodes

if __name__ == '__main__':

    nodes = [
        {"prev_node": "0000000000000005","next_node": "0000000000000006"},
        {"prev_node": "0000000000000006","next_node": "0000000000000007"},
        {"prev_node": "0000000000000006","next_node": "0000000000000008"},
        {"prev_node": "0000000000000008","next_node": "0000000000000012"},
        {"prev_node": "0000000000000009","next_node": "0000000000000010"},
        {"prev_node": "0000000000000010","next_node": "0000000000000011"},
        {"prev_node": "0000000000000014","next_node": "0000000000000015"},
        {"prev_node": "0000000000000015","next_node": "0000000000000016"},
        {"prev_node": "0000000000000016","next_node": "0000000000000017"},
        {"prev_node": "0000000000000018","next_node": "0000000000000019"},
        {"prev_node": "0000000000000020","next_node": "0000000000000021"},
        {"prev_node": "0000000000000019","next_node": "0000000000000020"},
        {"prev_node": "0000000000000012","next_node": "0000000000000022"},
        {"prev_node": "0000000000000022","next_node": "0000000000000023"},
        {"prev_node": "0000000000000023","next_node": "0000000000000009"},
        {"prev_node": "0000000000000011","next_node": "0000000000000024"},
        {"prev_node": "0000000000000024","next_node": "0000000000000014"},
        {"prev_node": "0000000000000017","next_node": "0000000000000025"},
        {"prev_node": "0000000000000025","next_node": "0000000000000018"},
        {"prev_node": "0000000000000007","next_node": "0000000000000021"},
        {"prev_node": None, "next_node": "0000000000000005"},
        {"prev_node": "0000000000000021", "next_node": None}
    ]
    graph = build_graph(nodes)
    branches, nodes = travel('root', graph)

    print("branch num: %d" % branches)
    print("max depth branch:")
    for i in nodes[::-1]:
        print(i)

branch num: 2
max depth branch:
root
0000000000000005
0000000000000006
0000000000000008
0000000000000012
0000000000000022
0000000000000023
0000000000000009
0000000000000010
0000000000000011
0000000000000024
0000000000000014
0000000000000015
0000000000000016
0000000000000017
0000000000000025
0000000000000018
0000000000000019
0000000000000020
0000000000000021

这篇关于javascript - 流程图获取深度,求各位算法高手帮帮忙的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆