查找无向图中的所有简单循环

时间:2017-05-19 18:55:29

标签: python algorithm graph dfs

我正在尝试实现在无向图中查找所有简单循环的任务。最初,任务是找到所有固定长度的循环(= 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)

6 15
5 4
2 0
3 1
5 1
4 1
5 3
1 0
4 0
4 3
5 2
2 1
3 0
3 2
5 0
4 2

(输出:20)

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

(输出: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)

0 个答案:

没有答案