[ baekjoon ] 11724. 接続要素の数
11724.接続要素の数
質問する
方向図があるかどうかは、接続要素の数を計算するプログラムを作成します.
入力
第1行は、頂点の個数Nと、幹線の個数Mとを与える.(1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N−1)/2)2行目から、幹線の両端点uおよびvがM行に与えられる.(1≦u,v≦N,u≠v)のような幹線は一度しか与えられない.
しゅつりょく
接続要素の数を最初の行に出力します.
接続要素とは、無方向図で2つの異なる頂点がパスで接続されていることを意味します.
親シェイプに他の頂点がない部分を表すシェイプ
接続要素になる条件
1.エレメント内のすべての頂点を接続するパスが必要です.
2.他の接続要素に属する頂点に接続するパスは使用できません.
DFSアルゴリズムを用いたコードは多い.
クルーズアルゴリズムでソースコードを書きました DFSアルゴリズム を追加
UNION
->sys.setrecursionlimitの作成(10000)
基本的には1000です
質問する
方向図があるかどうかは、接続要素の数を計算するプログラムを作成します.
入力
第1行は、頂点の個数Nと、幹線の個数Mとを与える.(1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N−1)/2)2行目から、幹線の両端点uおよびvがM行に与えられる.(1≦u,v≦N,u≠v)のような幹線は一度しか与えられない.
しゅつりょく
接続要素の数を最初の行に出力します.
接続要素とは、無方向図で2つの異なる頂点がパスで接続されていることを意味します.
親シェイプに他の頂点がない部分を表すシェイプ
接続要素になる条件
1.エレメント内のすべての頂点を接続するパスが必要です.
2.他の接続要素に属する頂点に接続するパスは使用できません.
DFSアルゴリズムを用いたコードは多い.
クルーズアルゴリズムでソースコードを書きました
UNION
## 11724_연결요소의 개수
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
graph = []
for _ in range(m):
a, b = map(int, input().split())
if a > b: # 첫번째 정점 번호를 작게 만듬
a, b = b, a
graph.append((a, b))
parent = [0] * (n + 1)
for i in range(n + 1):
parent[i] = i
def find_parent(parent, a): # 특정 원소가 속핮 집합 찾기
if parent[a] != a:
parent[a] = find_parent(parent, parent[a])
return parent[a]
def union_parent(parent, a, b): # 집합 합치기
a = find_parent(parent, a)
b = find_parent(parent, b)
parent[b] = a
graph.sort()
before = 0
# 간선 하나씩 확인
for edge in graph:
a, b = edge
if before == find_parent(parent, a): # 처리됐던 번호(a)와 같으면 pass
union_parent(parent, before, b)
pass
elif before == find_parent(parent, b):
union_parent(parent, before, a)
pass
else: # 부모가 바뀌지 않았으면
before = find_parent(parent, a)
union_parent(parent, a, b) # 집합 합치기
print(len(set(parent)) - 1)
# 첫번째 원소가 0이기 때문에 이것을 제외한 집합 개수 찾기
DFSimport sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline
n, m = map(int, input().split())
graph = [[] for i in range(n + 1)]
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
visited = [False] * (n + 1)
def dfs(v):
visited[v] = True
for i in graph[v]:
if not visited[i]:
dfs(i)
result = 0
for i in range(1, n + 1):
if not visited[i]:
dfs(i)
result += 1
print(result)
pythonは再帰制限に関連しており、再帰許容値を超えた場合、実行時エラーが発生します.->sys.setrecursionlimitの作成(10000)
基本的には1000です
Reference
この問題について([ baekjoon ] 11724. 接続要素の数), 我々は、より多くの情報をここで見つけました https://velog.io/@ayoung0073/algorithm-baekjoon-11724テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol