넓이 우선 탐색이란?
그래프 G와 시작점 S가 주어졌을 때 S에서 도달 가능한 모든 간선을 찾는 과정
동작 원리
먼저 거리가 1인 정점을 모든 찾은 후 2인 정점을 찾는 식으로 거리를 늘려가며 탐색
탐색을 하면서 시작점으로부터의 거리와 바로 직전 정점을 계산
직전정점 그래프(넓이 우선 탐색 트리)
시작점으로부터 각 정점에 들려야 하는 정점으로 만든 하위 그래프로 트리 형태
모든 정점이 연결되어 있고 nE(간선의 수) = nV(vertex의 수) - 1
예시)
주어진 그래프
1을 시작점으로한 넓이 우선 탐색 트리
코드 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73  | public class BfsExample {     /*      * 인접리스트로 구현된 그래프의 넓이우선 탐색      */     static int nV; //총 vertex 개수     static int nE; //총 edge 개수     static ArrayList<ArrayList<Integer>> adList = new <ArrayList<Integer>> ArrayList();     //그래프 구현을 위한 인접리스트     static int[] visit; //방문여부와 완료여부를 표시     // 0 - 방문 안함,   1 - 방문했지만 아직 탐색 안됨 , 2 - 탐색완료     static int[][] vertexInfo; //vertex의 위치 정보를 담는 2차원 배열                                //i번쨰 vertex의 정보 - vertexInfo[i][0] = distance                                //                   vertexInfo[i][1] = preVertex(상위 vertex)     public static void bfs(int i) {         visit = new int[nV];         vertexInfo = new int[nV][2];         Queue<Integer> q = new LinkedList();         q.offer(i); //탐색 시작 위치의 vertex를 큐에 넣는다.         visit[i] = 1;         vertexInfo[0][i] = 0;         while(!q.isEmpty()) { //Queue의 모든 작업이 없을때 까지             int temp = q.poll(); //Queue에서 작업(탐색을 위한 데이터)을 가져온다.             int tempDistance = vertexInfo[temp][0];              for(int j:adList.get(temp)) { //인접리스트에서 temp번째 vertex가 가지고 있는 간선 수만큼 반복                 if(visit[j]==0) { //vertex에 한번도 방문 안했을떄                     visit[j] = 1; //방문 체크를 한다.                     vertexInfo[j][0] = tempDistance + 1;                     vertexInfo[j][1] = temp; //상위 vertex 정보를 넣는다.                     System.out.println(temp + "에서 " + j + "로 이동");                     q.offer(j); //새로 찾은 vertex를 탐색하기 위해 Queue에 삽입                 }             }             visit[temp] = 2; //탐색 완료된 vertex 플래그         }         }     public static void main(String[] args) {         //인접리스트를 이용한 그래프 구현         Scanner scan = new Scanner(System.in);         nV = scan.nextInt();         nE = scan.nextInt();         for(int i=0;i<nV;i++) adList.add(new<Integer> ArrayList());         //adList에 담을 리스트(각 vertex마다 인접한 vertext를 표현한 리스트)         for(int i=0;i<nE;i++) {             int vertex1, vertex2;             vertex1 = scan.nextInt();             vertex2 = scan.nextInt();             adList.get(vertex1).add(vertex2);             adList.get(vertex2).add(vertex1);         }         //넓이우선 탐색시작         bfs(1);         int i = 0;         for(int[] vertex:vertexInfo) {             System.out.print(i++ + "-");             System.out.print("distance" + vertex[0] + ", ");             System.out.println("preVertex" + vertex[1]);         }     } }  | cs | 
'자료구조' 카테고리의 다른 글
| [Map] HashMap (0) | 2017.03.10 | 
|---|---|
| [Set]HashSet의 특징 (1) | 2017.03.09 | 
| [그래프] 인접리스트와 인접행렬을 이용한 구현 (0) | 2017.02.26 | 
| ArrayList와 LinkedList (0) | 2017.01.02 | 
| Array 배열 for Java (0) | 2016.12.23 |