-
반응형
https://www.acmicpc.net/problem/18232
18232번: 텔레포트 정거장
첫 번째 줄에 정수 N, M이 공백으로 구분되어 주어진다. (2 ≤ N ≤ 300,000, 0 ≤ M ≤ min(N×(N-1)/2, 300,000)) 두 번째 줄에 정수 S, E가 공백으로 구분되어 주어진다. (1 ≤ S, E ≤ N, S ≠ E) 그 다음 줄부터 M
www.acmicpc.net
풀이
먼저 입력을 받으면서 텔레포트 정거장을 그래프를 이용해서 연결해주었습니다.
그런 뒤, S부터 시작하며 BFS를 실행하여 E까지의 최단거리를 구했습니다.
1. 해당 정거장이 텔레포트 정거장이면, 연결된 정거장들을 통해 최단거리를 비교하며 진행합니다.
2. 다음정거장이 범위안에 있으면, 최단거리를 비교하며 진행합니다.
3. 이전 정거장이 범위안에 있으면, 최단거리를 비교하며 진행합니다.
시간복잡도
모든 노드를 방문하며 모든 정거장을 탐색한다고 하면 O(NM)이 됩니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st =new StringTokenizer(br.readLine()); int n = Integer.valueOf(st.nextToken()); int m =Integer.valueOf(st.nextToken()); st = new StringTokenizer(br.readLine()); int s = Integer.valueOf(st.nextToken()); int e = Integer.valueOf(st.nextToken()); ArrayList<ArrayList<Integer>> tel = new ArrayList<>(); for(int i=0;i<=n;i++){ tel.add(new ArrayList<>()); } for(int i=0;i<m;i++){ st= new StringTokenizer(br.readLine()); int from = Integer.valueOf(st.nextToken()); int to = Integer.valueOf(st.nextToken()); tel.get(from).add(to); tel.get(to).add(from); } Queue<Integer> q = new LinkedList<>(); int[] visited = new int[n+1]; Arrays.fill(visited,Integer.MAX_VALUE); visited[s] = 0; q.offer(s); while(!q.isEmpty()){ int now = q.poll(); if(now == e) break; for(int next : tel.get(now)){ if(visited[next]>visited[now]+1){ visited[next]=visited[now]+1; q.offer(next); } } if(now+1<=n &&visited[now+1] > visited[now]+1){ visited[now+1] = visited[now]+1; q.offer(now+1); } if(now-1>=1 && visited[now-1] > visited[now]+1){ visited[now-1] = visited[now]+1; q.offer(now-1); } } System.out.println(visited[e]); } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 1473번 미로 탈출 (Java) (0) 2022.12.28 [백준OJ] 8980번 택배 (Java) (0) 2022.12.27 [백준OJ] 1793 타일링 (Java) (0) 2022.12.15 [백준OJ] 1926번 그림 (0) 2022.12.13 [백준OJ] 13022번 늑대와 올바른 단어 (0) 2022.12.06 댓글