[python]11724接続表示個数


👉 11724接続要素数



[正解コード]
import sys
sys.setrecursionlimit(10**6)

def dfs(graph, visited, n):
    visited[n] = 1
    for i in graph[n]:
        if visited[i] != 1:
            visited[i] = 1
            dfs(graph, visited, i)

n, m = map(int, sys.stdin.readline().split())
graph = {}
for i in range(n):
    graph[i + 1] = []
visited = [0] * (len(graph) + 1)
for i in range(m):
    u, v = map(int, sys.stdin.readline().split())
    graph[u].append(v)
    graph[v].append(u)

visited[0] = 1
cnt = 0
while 0 in visited:
    node = 0
    for i in range(len(visited)):
        if visited[i] == 0:
            node = i
            break
    if node != 0:
        dfs(graph, visited, node)
        cnt += 1
print(cnt)
[回答]
  • 図を実現する方法としては,隣接行列法,隣接リスト法があり,時間,空間の複雑さを考慮して隣接リスト法として実現した.
    -mainではwhile文と内部のfor文を統合するとO(n^2)の時間的複雑さが生じるが,定点の個数1<=n<=1000となるため,このようにした.(Python 3の提出で10,000は簡単に完了...)
  • dfsで接続要素が見つかるたびにcnt+=1が与えられる.
  • [トラブルシューティング]
    ランタイムエラー
    Pythonの場合、recursionlimitは1000なのでsys.setrecursionlimit(10**6)で解決できますが、この値を再帰的に超えるとセグメントエラーが発生します.
    bfs、dpは、dfsと比較して、再帰ではなく繰り返し文を使用することによって解決することができる.(リンクを参照)
    [アプリケーション構造とアルゴリズム]
  • Graph
  • DFS, BFS