인접 행렬 | 인접 리스트 | |
---|---|---|
A와 B를 잇는 간선 존재 여부 | O(1) | O(min(deg(A),deg(B))) |
A와 연결된 모든 정점 확인 | O(V) | O(deg(A)) |
공간 복잡도 | O(V^2) | O(E) |
// x를 갈 수 있다는 걸 알고 방문한 상태
static void dfs(int x){ // -> 모든 정점이 x로 한번씩만 O(V)
// x 방문
visit[x] = true;
// x에서 갈 수 있는 곳들을 모두 방문
for(int y : x에서 갈 수 있는 점 들){ // -> 인접행렬 O(V) || 인접리스트 O(deg(x))
if(visit[y]) // visit[y]가 true면 이 y는 무시
continue;
// 아직 안가본 y라면 가보자
dfs(y);
}
}
// start에서 시작해 갈 수 있는 정점 모두 탐색
static void bfs(int start){
Queue<Integer> que = new LinkedList<>();
//start는 방문 가능, que에 add
visit[start] = true; // !!! start를 갈 수 있다고 표시
que.add(start);
while(!que.isEmpty()){ // 더 확인할 점이 없다면 정지
int x = que.poll(); // -> 모든 정점이 한번만 등장
for(int y : x에서 갈 수 있는 점들){
if(visit[y]) continue; // x에서 y를 갈 수는 있지만 이미 탐색한 점이면 무시
// y를 갈 수 있으니까 que 추가하고 visit 추가
que.add(y);
visit[y] = true;
}
}
}
visit[]=true
que.add()
visit[]=true
,que.add()