문제
https://www.acmicpc.net/problem/11724
걸린 시간
00 : 22 : 54
풀이
Python3
import sys
input = sys.stdin.readline
class Node():
def __init__(self, v):
self.vertex = v
self.link = None
class listGraph():
def __init__(self):
self.n = 0 # vertex count
self.adj_list = []
# adj_list 의 인덱스를 정점의 번호로 설정
def insert_vertex(self):
self.adj_list.append(None)
self.n += 1
# v값을 u의 인접 리스트에 삽입
def insert_edge(self, u, v):
new = Node(v)
if u > self.n-1 or v > self.n-1:
print("out of area")
else:
new = Node(v)
new.vertex = v
new.link = self.adj_list[u]
self.adj_list[u] = new
def dfs(g, v, visited):
visited[v] = True
w = g.adj_list[v]
while w != None:
if not visited[w.vertex]:
dfs(g, w.vertex, visited)
w = w.link
def find_connected_component(g, visited):
count = 0
# 0번 정점 사용하지 않음
for i in range(1, g.n):
if not visited[i]:
count += 1
dfs(g, i, visited)
print(count)
if __name__ == "__main__":
sys.setrecursionlimit(2000)
N, M = map(int, input().strip().split())
g = listGraph()
for _ in range(0, N+1):
g.insert_vertex()
for _ in range(0, M):
u, v = map(int, input().strip().split())
g.insert_edge(u, v)
g.insert_edge(v, u)
visited = [False for _ in range(0, N+1)]
find_connected_component(g, visited)
리스트로 구현한 그래프의 소스를 가져다가 사용했다. 문제의 시간제한이 3초로 넉넉해 통과는 했지만 시간, 메모리 측면에서 많이 비효율적이다.
효율적인 풀이
Python3
import sys
input = sys.stdin.readline
def dfs(v, visited):
visited[v] = True
for i in adj[v]:
if not visited[i]:
dfs(i, visited)
def find_connected_component(visited):
count = 0
# 0번 정점 사용하지 않음
for i in range(1, len(adj)):
if not visited[i]:
count += 1
dfs(i, visited)
print(count)
if __name__ == "__main__":
sys.setrecursionlimit(2000)
N, M = map(int, input().strip().split())
adj = [[] for i in range(0, N+1)]
for _ in range(0, M):
u, v = map(int, input().strip().split())
adj[u].append(v)
adj[v].append(u)
visited = [False for _ in range(0, N+1)]
find_connected_component(visited)
그래프에 대한 이해가 부족하지 않다면 인접 노드를 보관하는 리스트만 하나 두어 그래프를 구현해도 될 것 같다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 1107번 리모컨 (0) | 2020.08.11 |
---|---|
Baekjoon 7662번 이중 우선순위 큐 (0) | 2020.08.10 |
Baekjoon 1003번 피보나치 함수 (0) | 2020.08.10 |
Baekjoon 11273번 집합 (0) | 2020.08.10 |
Baekjoon 7576번 토마토 (0) | 2020.08.10 |
댓글