본문 바로가기
백준/25001 - 30000

[백준] 26146번 : 즉흥 여행 (Easy)

by lms0806 2025. 8. 10.
728x90
반응형

https://www.acmicpc.net/problem/26146

 

해당 문제는 SCC(강한 연결 요소)의 기본 문제로, dfs와 백트래킹에 대해 학습을 진행하신 이후에 진행하시는 걸 추천드립니다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Stack;
import java.util.StringTokenizer;

public class Main {
	static boolean[] visited;
	static Stack<Integer> stack = new Stack<>();
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int v = Integer.parseInt(st.nextToken()), e = Integer.parseInt(st.nextToken());
		
		visited = new boolean[v + 1];
		ArrayList<Integer>[] graph = new ArrayList[v + 1], reversegraph = new ArrayList[v + 1];
		
		for(int i = 1; i <= v; i++) {
			graph[i] = new ArrayList<>();
			reversegraph[i] = new ArrayList<>();
		}
		
		while(e --> 0) {
			st = new StringTokenizer(br.readLine());
			int from = Integer.parseInt(st.nextToken()), to = Integer.parseInt(st.nextToken());
			
			graph[from].add(to);
			reversegraph[to].add(from);
		}
		
		for(int i = 1; i <= v; i++) {
			if(!visited[i]) {
				dfs(i, graph, true);
			}
		}
		
		Arrays.fill(visited, false);
		
		dfs(stack.pop(), reversegraph, false);
		
		String answer = "Yes";
		while(!stack.isEmpty()) {
			if(!visited[stack.pop()]) {
				answer = "No";
				break;
			}
		}
		
		System.out.print(answer);
	}
	
	public static void dfs(int depth, ArrayList<Integer>[] graph, boolean check) {
		visited[depth] = true;
		
		for(int a : graph[depth]) {
			if(!visited[a]) {
				dfs(a, graph, check);
			}
		}
		
		if(check) {
			stack.add(depth);
		}
	}
}
728x90
반응형

'백준 > 25001 - 30000' 카테고리의 다른 글

[백준] 28282번 : 운명  (0) 2024.11.27
[백준] 28066번 : 타노스는 요세푸스가 밉다  (0) 2024.11.08
[백준] 25430번 : 다이제스타  (0) 2022.12.04

댓글