Python 有没有一种启发式方法可以从有向图中的特定节点中找到最长的简单循环?

Python 有没有一种启发式方法可以从有向图中的特定节点中找到最长的简单循环?,python,data-structures,graph,networkx,heuristics,Python,Data Structures,Graph,Networkx,Heuristics,到目前为止,我只能想到使用networkx的暴力方法。但是,对于大型数据集,执行需要很长时间。我知道这是一个NP难问题,所以有没有一个启发式的解决方案,可以给出一个接近最优的解决方案 adj_列表是指标记为整数的2d节点列表 例如[1,2],[3,4],[3],[4],[4] 在图中,每个节点都标记为一个整数,其中节点按递增顺序从0到以上 如果adj_列表为[[1,2],[3,4],[3],[4],],则存在的节点为0,1,2,3,4 到目前为止,我只能想到使用networkx的暴力方法。但是,

到目前为止,我只能想到使用networkx的暴力方法。但是,对于大型数据集,执行需要很长时间。我知道这是一个NP难问题,所以有没有一个启发式的解决方案,可以给出一个接近最优的解决方案

adj_列表是指标记为整数的2d节点列表

例如[1,2],[3,4],[3],[4],[4]

在图中,每个节点都标记为一个整数,其中节点按递增顺序从0到以上

如果adj_列表为[[1,2],[3,4],[3],[4],],则存在的节点为0,1,2,3,4

到目前为止,我只能想到使用networkx的暴力方法。但是,对于大型数据集,执行需要很长时间。我知道这是一个NP难问题,所以有没有一个启发式的解决方案,可以给出一个接近最优的解决方案

adj_列表是指标记为整数的2d节点列表

例如[1,2],[3,4],[3],[4],[4]

在图中,每个节点都标记为一个整数,其中节点按递增顺序从0到以上

如果adj_列表为[[1,2],[3,4],[3],[4],],则存在的节点为0,1,2,3,4

节点0邻接列表->[1,2]

节点1邻接列表->[3,4]

节点2邻接列表->[3]

import networkx as nx


def create_graph(adj_list):
  length = len(adj_list)
  g = nx.DiGraph()

  for node in range(length):
    for towards in adj_list[node]:
      g.add_edge(node, towards)

  return g


def get_longest_cycle(adj_list, s):
  g = create_graph(adj_list)

  cycles = nx.simple_cycles(g)

  # print(cycles)
  largest = 0
  to_return = []
  for c in cycles:
    if s in c:
      if len(c)>largest:
          to_return=list(c)
          largest=len(c)

  

  return to_return