ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Data Structure] 그래프 순회, 탐색(BFS) - 자료 구조
    CSE/Data Structure 2016. 4. 16. 11:39


    그래프 순회(Graph Traversal)



    2. 너비 우선 탐색


    BFS(Breadth First Search)


    시작 정점으로부터 인접한 정점들을 모두 차례로 방문하고 나서

    방문했던 정점을 시작으로 다시 인접한 정점들을 차례로 방문하여 가까운 정점들을 번저 방문하는 방법


    인접한 정점들에 대해 차례로 다시 너비 우선 탐색을 반복해야 하므로 FIFO 구조를 갖는 Queue를 사용합니다.



    너비 우선 탐색 과정 



    초기 상태


    visited를 초기화하고 공백 큐 생성








    1. 정점 A를 시작으로 너비 우선 탐색 시작


    visited[A] = true;

    A 방문






    2. 정점 A에서 방문하지 않은 모든 인접 정점 B, C를 방문하고  큐에 enQueue


    visited[B & C] = true;

    B & C 방문

    enQueue(B & C);








    3. 정점 A에 대한 인접 정점들을 처리헀으므로 탐색을 계속할 다음 정점을 찾기 위해 deQueue하여 B를 받음


    vertex = deQueue();








    4. 정점 B에서 방문하지 않은 모든 인접 정점 D, E를 방문하고 큐에 enQueue


    visited[D&E] = true;

    D & E 방문

    enQueue(D & E);








    5. 정점 B에 대한 인접 정점을 처리했으므로 탐색을 계속할 다음 정점을 찾기위해 큐를 deQueue


    vertex = deQueue();








    6. 정점 C에 방문하지 않은 정점이 없으므로 탐색을 계속할 다음 정점을 찾기 위해 큐를 deQueue


    vertex = deQueue();












    7. 정점 D에 방문하지 않은 정점 G를 방문하고 큐에 enQueue


    visited[G] = true;

    G 방문

    enQueue(G);








    8. 정점 D에 대한 인접 정점들을 처리했으므로 탐색을 계속할 다음 정점을 찾기위해 큐를 deQueue


    vertex = deQueue();









    9. 정점 E에는 방문하지 않은 인접 정점이 없으므로 탐색을 계속할 다음 정점을 찾기 위해 큐를 deQueue


    vertex = deQueue();






    10. 정점 G에서 방문하지 않은 인접 정점 F를 방문하고 큐에 enQueue


    visited[F] = true;

    F 방문

    enQueue(F);




    11. 정점 G에 대한 인접 정점을 처리했으므로 탐색을 계속할 정점을 찾기 위해 큐를 deQueue


    vertex = deQueue();







    12. 정점 F는 모든 인접 정점을 방문했으므로 다음 정점을 찾기 위해 deQueue, 하지만 큐가 공백이므로 탐색 종료







    링크드 리스트로 표현된 너비 우선 탐색 예제를 봅시다.





     * Graph2.java


    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    package ssww;
     
     
    public class Graph2 {
        GraphType g;
        
        public Graph2() {
            g = new GraphType();
            g.n = 0;
            
            for (int i = 0; i < g.MAXVERTEX; i++) {
                g.visited[i] = false;
                g.adjList[i] = null;
            }
        }
        
        public void insertVertex(int v) {
            if ((g.n + 1> g.MAXVERTEX) {
                System.out.println("그래프의 정점의 갯수 초과!");
                return;
            }
            
            g.n++;
        }
        
        public void insertEdge(int u, int v) {
            GraphNode node;
            
            if (u >= g.n || v >= g.n) {
                System.out.println("그래프에 없는 정점!");
                return;
            } 
            node = new GraphNode();
            node.vertex = v;
            node.link = g.adjList[u];
            g.adjList[u] = node;
        }
        
        public void printAdjList() {
            GraphNode tmp;
            
            for (int i = 0; i < g.n; i++) {
                System.out.println("\n\t 정점 " + (char)(i + 65+ "의 인접 리스트");
                tmp = g.adjList[i];
                
                while (tmp != null) {
                    System.out.print(" -> " + (char) (tmp.vertex + 65));
                    tmp = tmp.link;
                }
            }
        }
     
        public void breadthFirstSearch(int v) {
            GraphNode tmp;
            Queue queue = new Queue();
            g.visited[v] = true;
            System.out.print(" " + (char)(v + 65));
            queue.enQueue(v);
            
            while (! queue.isEmpty()) {
                v = queue.deQueue();
                
                for (tmp = g.adjList[v]; tmp != null; tmp = tmp.link) {
                    if (!g.visited[tmp.vertex]) {
                        g.visited[tmp.vertex] = true;
                        System.out.print(" " + (char) (tmp.vertex + 65));
                        queue.enQueue(tmp.vertex);
                    }
                }
            }
        }
    }
     
    class QueueNode {
        int data;
        QueueNode link;
        
        public QueueNode(int data) {
            this.data = data;
        }
    }
     
    class Queue {
        QueueNode front, rear;
        
        public Queue() {
            front = null;
            rear = null;
        }
        
        public boolean isEmpty() {
            if (front == nullreturn true;
            return false;
        }
        
        public void enQueue(int data) {
            QueueNode node = new QueueNode(data);
            node.link = null;
            
            if (front == null) {
                front = node;
                rear = node;
            } else {
                rear.link = node;
                rear = node;
            }
        }
        
        public int deQueue() {
            QueueNode oldNode = front;
            int data;
            
            if (isEmpty()) return 0;
            else {
                data = oldNode.data;
                front = front.link;
                
                if (front == null
                    rear = null;
                oldNode = null;
                
                return data;
            }
        }
    }
     
     
     
     
    cs





     * GraphMain2.java


    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
    package ssww;
     
     
    public class GraphMain2 {
     
        public static void main(String[] args) {
            Graph2 graph = new Graph2();
            
            for (int i = 0; i < 7; i++
                graph.insertVertex(i);
            
            graph.insertEdge(02);
            graph.insertEdge(01);
            graph.insertEdge(14);
            graph.insertEdge(13);
            graph.insertEdge(10);
            graph.insertEdge(24);
            graph.insertEdge(20);
            graph.insertEdge(36);
            graph.insertEdge(31);
            graph.insertEdge(46);
            graph.insertEdge(42);
            graph.insertEdge(41);
            graph.insertEdge(56);
            graph.insertEdge(65);
            graph.insertEdge(64);
            graph.insertEdge(63);
            
            System.out.print("\n 인접 리스트: ");
            graph.printAdjList();
            
            System.out.println("\n너비 우선 탐색: ");
            graph.breadthFirstSearch(0);
        }
     
    }
     
     
     
    cs




    * 클래스 다이어그램










     

    end





    tags: Data Structure, 그래프, Graph, 자료 구조, 간선, 정점, Vertex, EdgeGraph Traversal, Graph Search, Traverse, 그래프 순회, BFS, BreadthFirstSearch


    댓글

Designed by Tistory.