https://www.acmicpc.net/problem/25195
25195번: Yes or yes
첫째 줄에는 정점의 개수 $N$과 간선의 개수 $M$이 주어진다. ($1 \leq N, M \leq 100\,000$) 이후 $M$줄에 걸쳐서 간선의 정보를 나타내는 두 정수 $u$, $v$ 가 주어진다. 이는 정점 $u$ 에서 정점 $v$ 로 가는
www.acmicpc.net
저는 dfs를 이용해 문제를 해결하였습니다.
dfs를 이용해 팬을 안 만나는 경로가 있는지를 판단하였습니다.
현재 팬을 만났다면 false를 리턴하고, 다음으로 갈 경로가 없다면 true 리턴합니다.
(다음 경로가 없을 때 까지 진행하기 때문입니다.)
다음 경로를 돌면서 팬을 만날 수 없는 경로가 있다면 true로 바꾸고 결과를 내 문제를 해결하였습니다.
package BOJ.dfs;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_25195 {
private static final int START_POSITION = 1;
private static final String SHOULD_MEET = "Yes";
private static final String HAVE_CANT_MEET = "yes";
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int m = stoi.apply(st.nextToken());
List<Integer>[] list = new List[n+1];
for(int i = 0 ; i <= n ; i++){
list[i] = new LinkedList<>();
}
for(int i = 0 ; i < m ; i++){
st = new StringTokenizer(br.readLine());
int start = stoi.apply(st.nextToken());
int end = stoi.apply(st.nextToken());
list[start].add(end);
}
boolean[] isFan = new boolean[n+1];
st = new StringTokenizer(br.readLine());
int s = stoi.apply(st.nextToken());
st = new StringTokenizer(br.readLine());
for(int i = 0 ; i < s ; i++){
int position = stoi.apply(st.nextToken());
isFan[position] = true;
}
boolean result = cantMeetFan(START_POSITION,isFan,list);
if(!result){
System.out.println(SHOULD_MEET);
}else{
System.out.println(HAVE_CANT_MEET);
}
}
private static boolean cantMeetFan(int position, boolean[] isFan, List<Integer>[] list) {
if(isFan[position]){
return false;
}
boolean result = false;
if(list[position].size() == 0){
return true;
}
for(int next : list[position]){
if(cantMeetFan(next,isFan,list)){
result = true;
}
}
return result;
}
}
'알고리즘' 카테고리의 다른 글
백준 29160번 나의 FIFA 팀 가치는? (JAVA) (1) | 2023.09.04 |
---|---|
백준 28353번 고양이 카페 (JAVA) (0) | 2023.09.03 |
백준 11726번 2Xn타일링 (JAVA) (0) | 2023.09.01 |
백준 10917번 Your life (JAVA) (0) | 2023.08.31 |
백준 1662번 압축 (JAVA) (0) | 2023.08.30 |