티스토리 뷰
728x90
반응형
문제 요약
- 알고리즘 분류: bfs
- 난이도:Silver2
- 문제내용:
- 넓이 우선 탐색후 각 노드 마다 방문 순서(오름차순)를 출력해라
문제풀이
이번 문제는 BFS 탐색 문제이다. BFS 탐색 알고리즘에 관한 자세한 설명은 여기에서 확인 해보면 알 수 있다.
여기 bfs에 추가되는 요건은 2가지이다.
- 오름차순 정렬
- 방문순서
1번은 그래프를 만든후 각 노드에서 연결 된 노드를 오름차순으로 정렬 하면되고 2번은 count변수를 선언한후 방문 할때마다 count를 늘려서 방문한 노드에 count를 넣으면된다. bfs알고리즘만 알면 구현은 간단해서 따로 설명은 안하겠다.
Code
Python
import sys
from collections import deque
input = sys.stdin.readline
def bfs(start_node):
global count
visited[start_node] = count
count += 1
queue = deque([start_node])
while queue:
node = queue.popleft()
for n in grape[node]:
if visited[n] == 0:
visited[n] = count
count += 1
queue.append(n)
N, M, start = map(int, input().split())
grape = {i : [] for i in range(1, N + 1)}
for _ in range(M):
a, b = map(int, input().split())
grape[a].append(b)
grape[b].append(a)
visited = [0] * (N + 1)
for i in range(1, N + 1):
grape[i].sort()
count = 1
bfs(start)
print('\n'.join(map(str, visited[1:])))
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static Map<Integer, ArrayList<Integer>> grape = new HashMap<Integer, ArrayList<Integer>>();
static int N;
static int[] visited;
static int count = 1;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int start = Integer.parseInt(st.nextToken());
for(int i = 1; i <= N; i++) {
grape.put(i, new ArrayList<Integer>());
}
visited = new int[N + 1];
int a, b;
for(int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine());
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
grape.get(a).add(b);
grape.get(b).add(a);
}
for(int i = 1; i <= N; i++) {
Collections.sort(grape.get(i));
}
bfs(start);
StringBuilder sb = new StringBuilder();
for(int i = 1; i <= N; i++) {
sb.append(visited[i]).append("\n");
}
System.out.println(sb);
}
public static void bfs(int strat_node) {
visited[strat_node] = count;
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(strat_node);
int node;
while(!queue.isEmpty()) {
node = queue.poll();
for(int n : grape.get(node)) {
if(visited[n] == 0) {
visited[n] = ++count;
queue.add(n);
}
}
}
}
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON]11057 오르막 수 (0) | 2023.02.04 |
---|---|
[BAEKJOON]24445 알고리즘 수업 - 너비 우선 탐색 2 (0) | 2023.02.03 |
[BAEKJOON]24480 알고리즘 수업 - 깊이 우선 탐색 2 (0) | 2023.02.01 |
[BAEKJOON]24479 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2023.01.30 |
[BAEKJOON]2096 내려가기 (0) | 2023.01.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Greedy
- 동적계획법
- 조합
- spring-boot
- 이론
- 구현
- 재귀호출
- 백준
- java
- 문자열
- 자바
- DP
- JSCODE
- 그리디
- 누적합
- 백트레킹
- LeetCode
- 파이썬
- Programmerse
- Python
- BaekJoon
- 동적 계획법
- BFS
- 알고리즘
- DFS
- 그래프
- 수학
- 배열
- level2
- 넓이 우선 탐색
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함