Python 无向图中所有单圈的求法

Python 无向图中所有单圈的求法,python,algorithm,graph,microsoft-distributed-file-system,Python,Algorithm,Graph,Microsoft Distributed File System,我试图实现一个任务,在无向图中找到所有简单的圈。最初,任务是找到所有固定长度(=3)的循环,我利用邻接矩阵的属性成功地做到了这一点。但在使用这种方法之前,我也尝试使用DFS,它对于非常小的输入大小是正确的,但是对于更大的输入,它变得疯狂,以(几乎)无限循环结束。我试图修复代码,但它就是找不到所有的周期 我的代码附在下面 1。请不要注意使用的几个全局变量。使用另一种方法的工作代码已经提交。这只是为了让我看看如何使DFS正常工作 2.是的,在发布此问题之前,我已经搜索了此问题,但我找到的选项使用了不

我试图实现一个任务,在无向图中找到所有简单的圈。最初,任务是找到所有固定长度(=3)的循环,我利用邻接矩阵的属性成功地做到了这一点。但在使用这种方法之前,我也尝试使用DFS,它对于非常小的输入大小是正确的,但是对于更大的输入,它变得疯狂,以(几乎)无限循环结束。我试图修复代码,但它就是找不到所有的周期

我的代码附在下面

1。请不要注意使用的几个全局变量。使用另一种方法的工作代码已经提交。这只是为了让我看看如何使DFS正常工作

2.是的,在发布此问题之前,我已经搜索了此问题,但我找到的选项使用了不同的方法,或者只是检测是否存在循环。此外,我想知道是否有可能修复我的代码

非常感谢任何能帮忙的人

num_res = 0
adj_list = []
cycles_list = []


def dfs(v, path):
    global num_res
    for node in adj_list[v]:
        if node not in path:
            dfs(node, path + [node])
        elif len(path) >= 3 and (node == path[-3]):
            if sorted(path[-3:]) not in cycles_list:
                cycles_list.append(sorted(path[-3:]))
                num_res += 1


if __name__ == "__main__":
    num_towns, num_pairs = [int(x) for x in input().split()]
    adj_list = [[] for x in range(num_towns)]
    adj_matrix = [[0 for x in range(num_towns)] for x in range(num_towns)]

    # EDGE LIST TO ADJACENCY LIST
    for i in range(num_pairs):
        cur_start, cur_end = [int(x) for x in input().split()]
        adj_list[cur_start].append(cur_end)
        adj_list[cur_end].append(cur_start)

    dfs(0, [0])

    print(num_res)
UPD:以下输入正常工作:

5 8
4 0
0 2
0 1
3 2
4 3
4 2
1 3
3 0
(产出:5)

(产出:20)

(输出:0)

不给出任何输出,只是继续循环

22 141
5 0
12 9
18 16
7 6
7 0
4 1
16 1
8 1
6 1
14 0
16 0
11 9
20 14
12 3
18 3
1 0
17 0
17 15
14 5
17 13
6 5
18 12
21 1
13 4
18 11
18 13
8 0
15 9
21 18
13 6
12 8
16 13
20 18
21 3
11 6
15 14
13 5
17 5
10 8
9 5
16 14
19 9
7 5
14 10
16 4
18 7
12 1
16 3
19 18
19 17
20 2
12 11
15 3
15 11
13 2
10 7
15 13
10 9
7 3
14 3
10 1
21 19
9 2
21 4
19 0
18 1
10 6
15 0
20 7
14 11
19 6
18 10
7 4
16 10
9 4
13 3
12 2
4 3
17 7
15 8
13 7
21 14
4 2
21 0
20 16
18 8
20 12
14 2
13 1
16 15
17 11
17 16
20 10
15 7
14 1
13 0
17 12
18 5
12 4
15 1
16 9
9 1
17 14
16 2
12 5
20 8
19 2
18 4
19 4
19 11
15 12
14 12
11 8
17 10
18 14
12 7
16 8
20 11
8 7
18 9
6 4
11 5
17 6
5 3
15 10
20 19
15 6
19 10
20 13
9 3
13 9
13 10
21 7
19 13
19 12
19 14
6 3
21 15
21 6
17 3
10 5

(输出应该是343)

没有“近乎无限”的循环。它不是无限就是有限。我还建议您添加测试用例,因为您的代码未能解决问题。好的,您是对的。我的意思是,我不知道这个循环是否是无限的,或者它会在一段时间内停止。
9 12
0 1
0 2
1 3
1 4
2 4
2 5
3 6
4 6
4 7
5 7
6 8
7 8
22 141
5 0
12 9
18 16
7 6
7 0
4 1
16 1
8 1
6 1
14 0
16 0
11 9
20 14
12 3
18 3
1 0
17 0
17 15
14 5
17 13
6 5
18 12
21 1
13 4
18 11
18 13
8 0
15 9
21 18
13 6
12 8
16 13
20 18
21 3
11 6
15 14
13 5
17 5
10 8
9 5
16 14
19 9
7 5
14 10
16 4
18 7
12 1
16 3
19 18
19 17
20 2
12 11
15 3
15 11
13 2
10 7
15 13
10 9
7 3
14 3
10 1
21 19
9 2
21 4
19 0
18 1
10 6
15 0
20 7
14 11
19 6
18 10
7 4
16 10
9 4
13 3
12 2
4 3
17 7
15 8
13 7
21 14
4 2
21 0
20 16
18 8
20 12
14 2
13 1
16 15
17 11
17 16
20 10
15 7
14 1
13 0
17 12
18 5
12 4
15 1
16 9
9 1
17 14
16 2
12 5
20 8
19 2
18 4
19 4
19 11
15 12
14 12
11 8
17 10
18 14
12 7
16 8
20 11
8 7
18 9
6 4
11 5
17 6
5 3
15 10
20 19
15 6
19 10
20 13
9 3
13 9
13 10
21 7
19 13
19 12
19 14
6 3
21 15
21 6
17 3
10 5