문제 해결을 위한 과정
위 문제는 이차원 리스트를 이용하는 것이 아닐 뿐 단순한 BFS알고리즘을 통해 해결할 수 있는 문제였습니다. 각각의 입력정보들을 입력받은 후 각 노드들에 대해서 방문처리하지 않았다면 BFS 함수를 호출하고 이때 호출된 횟수만큼을 출력해주면 되는 쉬운 문제였습니다.
소스코드
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
|
from collections import deque
n, m = map(int, input().split())
graph = [[] for _ in range(n+1)]
visited = [0] * (1 + n)
for _ in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
def bfs(graph, visited, start):
q = deque()
q.append(start)
visited[start] = 1
while q:
v = q.popleft()
for i in graph[v]:
if not visited[i]:
q.append(i)
visited[i] = 1
count = 0
for i in range(1, n + 1):
if visited[i] == 0:
bfs(graph, visited, i)
count += 1
print(count)
|
cs |
소스코드 - python
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#define MAX 1001
using namespace std;
vector<int> graph[MAX];
bool visited[MAX];
void bfs(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < graph[x].size(); i++) {
int y = graph[x][i];
if (!visited[y]) {
visited[y] = true;
q.push(y);
}
}
}
}
int main(void) {
int n, m;
int count = 0;
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
int a, b;
scanf("%d %d", &a, &b);
graph[a].push_back(b);
graph[b].push_back(a);
}
for (int i = 1; i < n+1; i++) {
sort(graph[i].begin(), graph[i].end());
}
for (int i = 1; i < n + 1; i++) {
if (!visited[i]) {
bfs(i);
count += 1;
}
}
printf("%d", count);
return 0;
}
|
cs |
'알고리즘 > 백준' 카테고리의 다른 글
백준 알고리즘 9095: 1, 2, 3 더하기(Python) (0) | 2021.02.06 |
---|---|
백준 알고리즘 2468: 안전 영역(Python) (2) | 2021.02.05 |
백준 알고리즘 1012: 유기농 배추(Python) (0) | 2021.02.05 |
백준 알고리즘 14503: 로봇 청소기(Python) (0) | 2021.02.03 |
백준 알고리즘 10773: 제로(Python) (0) | 2021.02.03 |