アルゴリズムパス(グラフィックDFS)の参照(2つの方法)
再利用するにはアクセスカードを外して戻る必要があります
メソッド1)graph変数に関連付けられたノードのみを含む
メソッド1)graph変数に関連付けられたノードのみを含む
import sys
sys.stdin = open("input.txt", "rt")
input = sys.stdin.readline
def DFS(start):
global cnt
visited[start] = 1
if start == n:
cnt += 1
else:
for i in graph[start]:
if visited[i] == 0:
visited[i] = 1
DFS(i)
visited[i] = 0 # 체크 풀기!
return cnt
if __name__ == '__main__':
n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
print(graph)
cnt = 0
visited = [0]*(n+1)
print(DFS(1))
結果[[], [2, 3, 4], [1, 3, 5], [4], [2, 5], []]
6
方法2)隣接行列の作成import sys
sys.stdin = open("input.txt", "rt")
input = sys.stdin.readline
def DFS(v):
global cnt
global res
if v == n:
cnt += 1
for x in res:
print(x, end=' ')
print()
else:
for i in range(1, n+1):
if graph[v][i] == 1 and visited[i] == 0:
res.append(i)
visited[i] = 1
DFS(i)
visited[i] = 0
res.pop()
if __name__ == '__main__':
n, m = map(int, input().split())
graph = [[0]*(n+1) for _ in range(n+1)]
visited = [0]*(n+1)
for i in range(m):
a, b = map(int, input().split())
graph[a][b] = 1
print(graph)
cnt = 0
visited[1] = 1
res = []
res.append(1)
DFS(1)
print(cnt)
結果[[0, 0, 0, 0, 0, 0],
[0, 0, 1, 1, 1, 0],
[0, 1, 0, 1, 0, 1],
[0, 0, 0, 0, 1, 0],
[0, 0, 1, 0, 0, 1],
[0, 0, 0, 0, 0, 0]]
6
Reference
この問題について(アルゴリズムパス(グラフィックDFS)の参照(2つの方法)), 我々は、より多くの情報をここで見つけました https://velog.io/@rladuswl/Algorithm-경로탐색-그래프-DFS-두-가지-방법テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol