163AC - ABC054C: One-stroke Path

ABC54-C (300 points)
問題

与えられた  N 頂点  M 辺の単純無向グラフについて, 頂点  1 を始点として全ての頂点を  1 度だけ訪れるパスを数え上げる.

  •  2 \leq N \leq 8
  •  0 \leq M \leq N(N - 1)/2
  •  1 \leq a_i < b_i \leq N
方針
  • DFSで列挙.
# input
N, M = map(int, input().split())
G = [list(map(int, input().split())) for _ in range(M)]
edges = [set() for _ in range(N)]

for a, b in G:
    edges[a - 1].add(b - 1)
    edges[b - 1].add(a - 1)

def dfs(start, edges, path):
    path.append(start)
    if len(path) == N:
        path.pop()
        return 1
    ans = 0
    for u in edges[start]:
        if u in path:
            continue
        ans += dfs(u, edges, path)
    path.pop()
    return ans    

print(dfs(0, edges, []))