- 그래프 전체를 탐색
- 루트노드에서 시작하여 인접한 노드를 먼저 탐색.
- 깊게 탐색하기 전에 넓게 탐색하는 것.
- 너비우선탐색이 깊이우선탐색보다 좀 더 복잡.
- 재귀적으로 동작 하지 않는다.
- 그래프 탐색의 경우 어떤 노드를 방문했는지 여부를 반드시 검사.
- 방문한 노드들을 차례로 저장한 후 꺼낼 수 있는 큐를 사용
- 인접 리스트와 인접 행렬 두 방식으로 구현이 가능
- 인접 행렬
- 모든정점에 대하여 2차원 배열을 생성
- 모든정점에 연결된 다른 정점을 탐색하는 방법.
- 인접 리스트
- 모든 정점에 대하여 존재하는 간선만 탐색을 하는 방법
- list를 사용
- 그래프내에 적은 간선만을 가지는 경우 인접 리스트로 구현하는것이 유리
public class Bfs {
private int v;
private LinkedList<Integer> adj[];
public Bfs(int v) {
this.v = v;
adj = new LinkedList[v];
for(int i = 0 ; i < v ; i++) {
adj[i] = new LinkedList();
}
}
void addEdge(int v, int w) {
adj[v].add(w);
adj[w].add(v);
}
void BFS(int s) {
boolean visited[] = new boolean[v];
Deque<Integer> que = new ArrayDeque<>();
visited[s] = true;
que.add(s);
while(!que.isEmpty()) {
s = que.poll();
System.out.println(s + " ");
Iterator<Integer> iter = adj[s].iterator();
while(iter.hasNext()) {
int n = iter.next();
if(!visited[n]) {
visited[n] = true;
que.add(n);
}
}
}
}
}
댓글
댓글 쓰기