알고리즘

Graph - BFS 간단 개념 및 코드(JAVA)

jaewoo 2022. 12. 22. 14:56

 

1. Graph

- 그래프는 정점(Vertex) 또는 노드(Node)와 간선(Edge)로 표현하기 위해 사용한다.

 

2. Graph 관련 용어

- 노드(Node) 위치를 말한다. 정점(Vertex)라고도 한다.

- 간선(Edge): 위치 간의 관계를 표시한 선으로 노드를 연결한 선이라고 보면된다.

- 인접 정점(Adjacemt Vertex) : 간선으로 직접 연결된 정점(또는 노드)

- 참고용어

    -> 정점의 차수(Degree): 무방향 그래프에서 하나의 정점에 인접한 정점의 수

    -> 진입 차수(In-Degree): 방향 그래프에서 외부에서 오는 간선의 수

    -> 진출차수(Out-Degree): 방향 그래프에서 외부로 향하는 간선의 수

    -> 경로길이(Path Length):경로를 구성하기 위해 사용된 간선의 수

    -> 단순경로(Simple Path): 처음 정점과 끝 정점을 제외하고 중복된 정점이 없는 경로

    -> 사이클(Cycle) : 단순 경로의 시작 정점과 종료 정점이 동일한 경우

 

3. Graph 종류

 무방향 그래프(Undirected Graph)

   - 방향이 없는 그래프

   - 간선을 통해, 노드는 양방향으로 갈 수 있음

   - 보통 노드 A, B가 연결되어 있을 경우, (A,B) 또는 (B,A)로 표기한다.

  

방향 그래프(Directed Graph)

   -간선에 방향이 있는 그래프

   - 보통 노드 A,B가 A->로 가는 간선으로 연결되어 있을 경우, <A,B>로 표기한다.

     (<B,A> <A,B>는 다르다)

 

가중치 그래프(Weighted Graph)

  - 간선에 비용 또는 가중치가 할당된 그래프이다.

  - 일종에 비용이다. 가리라고도 생각해도 좋음

 

연결 그래프와 비연결 그래프

  -연결 그래프

      무방향 그래프에 있는 모든 노드에 대해 항상 경로가 존재하는 경우

  -비연결 그래프

      무방향 그래프에서 특정 노드에 대해 경로가 존재하지 않는 경우

 

사이클과 비순환 그래프 (Acyclic Graph)

  - 사이클(Cycle)

      단순 경로의 시작 노드와 종료 노드가 동일한 경우

 - 비순환 그래프(Acyclic Graph)

     사이클이 없는 그래프

 

BFS(Breadfth-First Search)

1. BFS와 DFS

  ==>  BFS  정점들과 같은 레벨에 있는 노드(형제노드들)을 먼저 탐색하는 방식

 ==> DFS 정점의 자식들을 먼저 탐색하는 방식

 

BFS 시간복잡도

 while문이 needVisit 을 도는 횟수가 V+E이다

그래서 O(V+E)

 

코드

 

 

 

            graph.put("A",new ArrayList<String>(Arrays.asList("B","C")));
            graph.put("B",new ArrayList<String>(Arrays.asList("A","D")));
            graph.put("C",new ArrayList<String>(Arrays.asList("A","G","H","I")));
            graph.put("D",new ArrayList<String>(Arrays.asList("B","E","F")));
            graph.put("E",new ArrayList<String>(Arrays.asList("D")));
            graph.put("F",new ArrayList<String>(Arrays.asList("D")));
            graph.put("G",new ArrayList<String>(Arrays.asList("C")));
            graph.put("H",new ArrayList<String>(Arrays.asList("C")));
            graph.put("I",new ArrayList<String>(Arrays.asList("C","J")));
            graph.put("J",new ArrayList<String>(Arrays.asList("I")));


        BfsStudy bfs = new BfsStudy();
        System.out.println(bfs.bfsFunc(graph,"A"));;
public ArrayList<String> bfs(HashMap<String,ArrayList<String> graphSearch, String startNode){
		
        	ArrayList<String> visited = new ArrayList<>();
            ArrayList<String> needVisit = new ArrayList<>();
            
            needVisit.add(startNode);
            
            while(needVisit.size() > 0){
            		String node = needVisit.remove(0);
                    
                    if(!visited.contains(node)){
                    		visited.add(node);
                            needVisit.add(graph.get(node));
                            
                    }
            }
            return visited;
            }

'알고리즘' 카테고리의 다른 글

백준 No.13305 주유소 - JAVA  (0) 2023.02.01
백준 No. 1753 JAVA  (1) 2023.02.01
백준 No.1463 1로 만들기 - JAVA  (0) 2023.01.30
백준 No.2252 줄 세우기 - JAVA  (0) 2023.01.28
[알고리즘] JAVA - Bubble 정렬  (0) 2022.12.15