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 |