[伯俊][Python]1724接続要素の個数


[伯俊]1724接続要素の個数


https://www.acmicpc.net/problem/11724

問題の説明📖


方向図があるかどうかは、接続要素の数を計算するプログラムを作成します.
入力
第1行は、頂点の個数Nと、幹線の個数Mとを与える.(1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N−1)/2)2行目から、幹線の両端点uおよびvがM行に与えられる.(1≦u,v≦N,u≠v)のような幹線は一度しか与えられない.
しゅつりょく
接続要素の数を最初の行に出力します.
I/O例

質問へのアクセス💡


各ノードに接続されたノードを含む
  • ノード数の空の配列を作成します.
  • bfs方式でアクセスノードをTrueとして処理する.
  • bfs関数を実行するたびにcnt+=1になります.

    問題を解く💡

    from collections import deque
    import sys
    
    N, M = map(int, input().split())
    visited = [False] *(N+1)
    graph = [[] for _ in range(N+1)]
    
    
    for i in range(M):
        x,y = map(int, sys.stdin.readline().split())
        # 연결돼있는 노드들 담기
        graph[x].append(y)
        graph[y].append(x)
    
    def bfs(graph, start, visited):
        queue = deque()
        queue.append(start)
        visited[start] = True
    
        while queue:
            x = queue.popleft()
            for i in graph[x]:
                if not visited[i]:
                    queue.append(i)
                    visited[i] = True
    
    cnt = 0
    for i in range(1, N+1):
        if not visited[i]:
            bfs(graph, i, visited)
            cnt += 1
    
    print(cnt)

    別の解釈💡


    ▶DFSプール.
    N, M = map(int, input().split())
    visited = [False] * (N+1)
    graph = [[] for _ in range(N+1)]
    
    for _ in range(M):
    	x, y = map(int, input().split())
        graph[x].append(y)
        graph[y].append(x)
        
    def dfs(v):
    	visited[v] = True
        for i in graph[v]:
        	if visited[i] == False:
            	dfs(i)
    
    cnt = 0
    for i in range(1, N+1):
    	if visited[i] == False:
        	dfs(i)
            cnt += 1
    
    print(cnt)