choah76   3년 전

이 문제를 풀기 위해 구상한 알고리즘은 다음과 같습니다.

1. 1~N의 숫자가 있는 list를 만들고, 그래프의 L[0]번( =1번) 정점에서 bfs를 시작한다.

2. bfs리턴값으로 방문한 지점들이 list로 나온다 (ex : vis = [1,2,3,4,5])

3. 1-N의 숫자가 있는 list에서 vis의 원소들을 제거한다. 

4. 다시 L[0]번 정점에서 bfs를 시작한다.

5. 이 반복한 횟수가 곧 연결요소의 개수이다.

그러나 자꾸 시간초과가 뜹니다. 개선점을 알려주시면 감사하겠습니다.

djm03178   3년 전

리스트에서 임의의 값을 remove하는 것은 그 원소를 찾고, 제거한 후 뒤에 있는 원소들을 전부 한 칸씩 당겨와야 하기 때문에 O(길이) 시간이 걸립니다.

choah76   3년 전

그럼 remove없이 i = 1 부터 i = N까지 bfs를 돌리는게 더 시간이 적게걸릴까요?

아니면 remove를 대체할 함수를 가르쳐주시면 감사하겠습니다. 아직 시간복잡도O(N)같은걸 배우지못한 학생이라 잘 모르겠습니다

djm03178   3년 전

지금의 vis나 VIS와 같은 구조 대신에, v[i]가 i번 정점을 방문했는가 여부를 나타내게 하는 리스트를 만들면 굳이 지우지 않아도 방문된 정점인지를 확인할 수 있습니다.

choah76   3년 전

그렇게 해보겠습니다

조언감사합니다!

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