1. 22~59줄 for문이 모든 정점에 대해서 도니까 모든 정점은 최소 1번 방문되고,
방문된 정점은 해당 for문이 끝나는 시점에
사이클에 속하는지 아닌지 판정이 되니까 괜찮아 보입니다.
2. 사이클을 찾아내려면 현재 경로에서 중복 방문된 점 "이후의" 점들을 알아야 하니
경로 기록을 안 할 수는 없을 텐데 다만 저라면 queue 말고 vector 쓸 것 같습니다.
굳이 앞에서 하나씩 빼지 않고 그냥 들어있는 채로 루프 돌려도 되니까요.
pv104 1년 전
제가 생각한 방법은 다음과 같습니다
1. 1~N까지 돌면서 스택에 초기값 i 세팅
2. DFS를 하면서 방문하지 않은 정점이라면 스택에 추가하고, 경로 저장용 큐에 추가
3. 다음에 갈 정점이 방문한 정점이라면 큐가 빌 때 까지 조건문 수행
3-1. 만약 큐의 첫번째 원소와 다음에 갈 정점이 같다면 싸이클이 있는 것이므로 해당 원소들은 모두 연결되었다고 생각하고 해당 원소들의 값을 -1로 변경
3-2. 다르다면 싸이클이 아니므로(=연결되지 않았으므로) 큐에서 제거
이 과정을 스택이 빌때까지 반복하는데, 그냥 생각나는대로 짜서 제대로 짠건지도 모르겠고 풀었는데 찝찝하네요...
궁금한 점은 두 가지입니다.
1. 제 코드는 이미 방문한 정점을 다시 방문하지 않는데, 방문한 정점을 다시 방문하지 않아도 정답이 될 수 있는건가요? 머리로 이해가 안 가네요..
2. 큐에 경로를 저장하는 방법 외에 다른 방법으로 경로를 저장할 수 있나요? 혹은 경로를 저장하지 않아도 풀 수 있는 방법이 있나요?