instarbucks   6년 전

안녕하세요

DFS 문제를 풀고있는 학생입니다!

항상 코드에서 백트래킹을 어느 부분에서 해줘야하는가 고민이 많이 됩니다!

DFS가 끝난 후에 48번쨰 라인에서 해주는 것과 51번 째 라인에서 해주는 것의 차이가 궁금합니다.

조언 부탁드려요!

upple1   6년 전

내부 포문을 돌면서 전에 visit을 해제하지 않은 곳은 못가겠죠

이경우는 모든 경로를 구하는것이 아니기때문에 오히려 visit을 0으로 처리하면 불필요하게 많은 연산을 하게 됩니다. 

모든경로를 구하는경우에는 말씀처럼 48번에서 해제해주면 구할수 있습니다. 

instarbucks   6년 전

조언 감사합니다!

혹시 하나 더 여쭈어도 될까요?

그럼 48번째 라인에서 visited[x]=0 하는 경우나 visited[i]=0 하는 경우

둘 다 같은 정점을 탐색하는 걸 출력해서 확인을 했습니다!


그런데 48번째 라인에서 visited[i]=0 을 하는 경우에는

시간 초과가 발생하는데, 혹시 이유를 아시면 설명 부탁드려도 될까요?

upple1   6년 전

visit을 0으로 만들어 주는 것은 모든 경로를(경우의 수)를 다 탐색하겠다는겁니다. map에서 갈림길이 많을경우 경우의 수가 기하급수적으로 증가합니다. 이 경우에는 한번 방문한곳은 다시 재방문하지 않도록 visit을 0으로 만드는 행위를 하면 안됩니다

instarbucks   6년 전

앗 친절한 답변 감사합니다. 제가 처음 말씀을 오해했었나봐요! visit을 0으로 만들 필요 없이 다른 방식으로 문제를 풀라고 말씀해주신 것 맞나요? 이 문제 같은 경우 map에서 row를 기준으로 col값을 탐색하면서 간선이 있으면 answer그래프에 넣어주는 방식으로 풀었는데, 만약에 같은 row에 col 값이 여러 개 있을 경우에는 한 col 정점을 탐색하고나서, 다시 돌아와서 이후에 있는 col 값을 탐색해야한다고 생각해서 visit을 사용한거거든요. 이 방식이 잘못된건가요? 답변 정말 감사드립니다~!

upple1   6년 전

질문자분께서 사용하신 알고리즘은 일반적으로 사용햐는 dfs풀이가 아니라서 선뜻 최적화된 풀이가 생각이 안나네요. 

이런 풀이는 해당 문제가 상대적으로 쉬운 조건을 요구해서 운좋게 푸신것 같고 만약에 저 풀이로 좀 더 복잡한 dfs문제를 풀게되면 아마도 흔하게 시간초과를 받을 것 같습니다.

제가 전에 답변한 것 역시 일반적인 풀이를 기준으로 말씀드린거고 제가 코드를 상세히 보지 않은 잘못이기도 하네요 ㅎㅎ...

instarbucks   6년 전

아니에요 제가 댓글을 잘못 읽어서 그렇습니다ㅠㅠ! 감사합니다. 문제점이 뭔지 몰랐는데 알 것 같아요! 정말 그 라인을 지우고 돌려봤더니 오히려 더 빠른 시간 내에 끝나더라구요. 조언 감사합니다 ! 

댓글을 작성하려면 로그인해야 합니다.