300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- linux
- 구글 킥스타트
- PYTHON
- 백준
- 딥러닝
- google coding competition
- 킥스타트
- 프로그래머스
- 파이썬
- DFS
- 리눅스
- CSS
- 동적 프로그래밍
- 운영체제
- 그래프
- OS
- dp
- 브루트포스
- kick start
- 네트워크
- 순열
- 코딩테스트
- 코딩 테스트
- 프로그래밍
- 알고리즘
- 동적프로그래밍
- nlp
- 코딩
- AI
- BFS
Archives
- Today
- Total
오뚝이개발자
[백준11724] 연결 요소의 개수 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/11724
생각의 흐름
adjacent matrix를 만들어 dfs로 탐색한다.
깨달은 점
adjacent list를 만들어 dfs로 탐색하는 방법도 있다.(아래 코드를 첨부한다. 출처 : https://home-body.tistory.com/287)
코드
방법 1(adjacent matrix 이용)
import sys
N, M = 0, 0
arr = []
visit = []
cnt = 0
def dfs(x):
if visit[x] == 1:
return
visit[x] = 1
for i in range(N):
if arr[x][i] == 1:
dfs(i)
if __name__=='__main__':
sys.setrecursionlimit(10**8)
# N은 정점, M은 간선의 갯수
N, M = map(int, sys.stdin.readline().split())
arr = [[] for i in range(N)]
visit = [0] * N
for i in range(N):
arr[i] = visit[:]
for _ in range(M):
u, v = map(int, sys.stdin.readline().split())
arr[u-1][v-1] = 1
arr[v-1][u-1] = 1
for i in range(N):
if visit[i] == 0:
dfs(i)
cnt += 1
print(cnt)
방법 2(adjacent list 이용)
def dfs(v):
visited[v] = True
for e in adj[v]:
if not visited[e]:
dfs(e)
N, M = map(int, input().split())
adj = [[] for i in range(N+1)]
visited = [False] * (N + 1)
cnt = 0
for i in range(M):
input_data = list(map(int, input().split()))
adj[input_data[0]].append(input_data[1])
adj[input_data[1]].append(input_data[0])
for i in range(1, len(visited)):
if not(visited[i]):
cnt += 1
dfs(i)
print(cnt)
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준2667] 단지번호붙이기 (0) | 2020.03.20 |
---|---|
[백준1261] 알고스팟 (0) | 2020.03.18 |
[백준4963] 섬의 개수 (0) | 2020.03.14 |
[백준15666] N과 M (12) (0) | 2020.03.14 |
[백준15665] N과 M (11) (0) | 2020.03.14 |
Comments