완전탐색
을 수행하기 위해 사용할 수 있는 가장 간단한 방법 중 하나이다시작 노드
를 스택에 넣고 방문 처리
한다방문 처리
한다시작 노드
를 스택에 넣고 방문 처리
한다true
, 모든 경로가 팬클럽을 만나게 되는 경우라면 탐색은 false
를 반환한다첫째 줄
에는 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N, M ≤ 100000)M줄
에 걸쳐서 간선의 정보를 나타내는 두 정수 uu, vv 가 주어진다. 이는 정점 u에서 정점 v로 가는 간선이 있음을 의미한다. (1 ≤ u, v ≤ N, u ≠ v)M+2번째 줄
에는 팬클럽 곰곰이가 존재하는 정점의 개수 S 가 주어진다. (1 ≤ S ≤ N)M+3번째 줄
에는 팬클럽 곰곰이가 존재하는 정점의 번호 s가 차례대로 S만큼 주어진다. (1 ≤ s ≤ N)// input
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
.readFileSync(filePath)
.toString()
.trim()
.split("\n");
const [N, M] = input[0].split(" ").map(Number);
const locationOfFans = input[input.length - 1].split(" ").map(Number);
const setOfLocation = new Set(locationOfFans);
// G (graph)
const G = Array.from(new Array(N + 1), () => []);
for (let i = 1; i <= M; i++) {
const [u, v] = input[i].split(" ").map(Number);
G[u].push(v);
}
// DFS
const dfs = (graph, start) => {
const stack = [start];
while (stack.length) {
const cur = stack.pop();
if (setOfLocation.has(cur)) continue;
if (!graph[cur].length) return true;
G[cur].forEach((next) => stack.push(next))
}
return false;
};
// output
console.log(dfs(G,1) ? "yes": "Yes")
계속 DFS 문제를 풀다가 풀게 된 DFS 문제라 뇌를 빼고 거의 이전 방법을 그대로 구현하려고 했었고, 그러다보니 일부 테스트케이스가 통과하지 못했다.
알고보니, 입력값 세팅부터 잘못 했었던,,, 정신차리고 풀어야겠다