개발자 톡
연습문제 톡
[HSAT 6회 정기 코딩 인증평가 기출] 출퇴근길
출퇴근길 BFS로는 안풀리나요? 반례나 문제점 부탁드립니다.
- 등록일
- 2023-03-31 08:37:37
- 조회수
- 1137
- 작성자
- smhyun128
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n, m;
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
// 그래프 n 개 정점
List[] adjList = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
adjList[i] = new ArrayList();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
// 일방 통행
adjList[start].add(end);
}
// 시작점과 끝 점의 경로가 하나 이상은 무조건 존재함
st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
// 각 정점에서 출발점과 도착점까지 갈 수 있는지 체크
boolean[] visitedS = new boolean[n + 1];
boolean[] visitedT = new boolean[n + 1];
bfs(adjList, S, visitedS, T);
bfs(adjList, T, visitedT, S);
int ans = 0;
for (int i = 1; i <= n; i++) {
if (i == S || i == T) continue; // 시작점이나 도착점인 경우에는 건너뜀
if (visitedS[i] && visitedT[i]) {
ans++;
}
}
System.out.println(ans);
}
private static void bfs(List[] adjList, int start, boolean[] visited, int end) {
Queue queue = new LinkedList();
queue.add(start);
visited[start] = true;
while (!queue.isEmpty()) {
int cur = queue.poll();
for (int next : adjList[cur]) {
if (visited[next] || next == end) continue;
visited[next] = true;
queue.add(next);
}
}
}
}
#[hsat_6회_정기_코딩_인증평가_기출]_출퇴근길
#java