
방향 o, 가중치 o
모든 정점의 차수의 합간선의 개수 x 2 → 그려보면 앎int[][] adjacencyMatrix = int new[vertex][vertex]; 
ArrayList<ArrayList<Integer>> adjacencyList;
or
ArrayList<Integer>[] adjacencyList; // 이게 쓰기 더 편한듯 
모든 정점의 차수합만큼 필요인접 리스트를 더 많이 씀
시작점에서 간선을 0개 이상 사용하여 갈 수 있는 모든 정점들을 찾는 것
visit 배열, 인접 행렬 or 인접 리스트 변수 필요한번 메소드가 실행되면 방문할 수 있는 정점을 모두 탐색함재귀 함수 사용 //start 를 갈 수 있다는 걸 알고 방문한 상태
void dfs(int start) {
//1. visit check
visit[start] = true;
//2. 정답 갱신
sb.append(start).append(' ');
//3. 갈 수 있는 모든 정점
for (int i : adjacencyList[start]) {
//처리하지 않을 정점을 조건문으로 걸러냄
if (visit[i]) {
continue;
}
//조건을 모두 통과한 정점에 대해 dfs
dfs(i); // 재귀 -> 더 깊게 들어감
}
}
visit 체크갈 수 있는 모든 정점에 대해 dfs(재귀)Queue 사용 // start 에서 시작해서 갈 수 있는 정점들을 모두 탐색하기
void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
//1. 큐에 시작점 넣고 visit check
queue.add(start);
1번 visit[start] = true; // start 를 갈 수 있다고 표시하기 (중요!!!)
//2. 큐에 더 이상 값이 없을 때까지, 즉 갈 수 있는 정점이 없을 때까지 탐색
while (!queue.isEmpty()) {
int number = queue.poll();
//큐에서 꺼낼 때 정답 갱신
sb.append(number).append(' ');
// visit[number] = true;
// visit 체크를 1,2번에서 하지 않고 여기서 하면 특수한 경우에 문제가 발생할 수 있음
// 반드시 큐에 넣을 때 visit 체크를 해야 함
//큐에 넣을 수 있는 모든 정점
for (int i : adjacencyList[number]) {
//처리하지 않을 정점을 조건문으로 걸러냄
if (visit[i]) {
continue; // number 에서 i 를 갈 수는 있지만, 이미 탐색한 점이면 무시
}
//조건을 통과한 정점을 큐에 넣고 visit check
// y를 갈 수 있으니까 queue 에 추가하고, visit 처리 하기!
queue.add(i);
2번 visit[i] = true;
}
}
}
시작점(start)를 큐에 넣고 visit checkwhile(!queue.isEmpty)큐에 있는 정점 하나 꺼냄해당 정점이 갈 수 있는 모든 정점 체크해서 큐에 넣고 visit checkvisit 체크를 하는 시점큐에 넣을 때 visit 체크를 해야함시작점이 여러 개인 BFS
