728x90
그래프 관련 정리 -(1)
그래프의 종류
⬛ 1) 무방향 그래프
G = (V, E) 로 표시
⬛ 2) 방향 그래프
G = <V.E> 로 표시
⬛ 3) 가중치 방향 그래프
그래프의 구현
⬛ 1) 인접행렬
graph[a][b] 로 표현
⬛ 2) 인접리스트
ArryList<ArrayList> graph 로 표현각 정점에 연결된 정점들 정보를 ArrayList 하나에 표현하는데, 그 정점들을 모아 전체 그래프로 표현한 것
그래프의 순회
⬛ 1) 깊이 우선 탐색 DFS
⬛ 2) 너비 우선 탐색 BFS
7-11. 경로 탐색 (인접 행렬) | DFS
import java.util.Scanner;
/* 7-12. 경로 탐색 (인접행렬) */
class Main1 {
static int n, m, answer = 0; //입출력 변수
static int[][] graph; //그래프 표시 (인접행렬)
static int[] ch; //방문 체크용
//DFS() 함수
public void DFS(int v) {
//들어온 정점v가 목적지n 도달시 카운팅++
if(v==n) answer++;
else {
//각 정점 v에 대하여 가능한 정점i들 탐색하여 뻗어나감
for(int i=1; i<=n; i++) {
//각 정점v에 대해 가능한 i 탐색 동시에 방문전인 정점에 대하여 뻗어나감
if(graph[v][i] == 1 && ch[i] == 0) {
ch[i] = 1;//방문 체크
DFS(i); //해당 i정점에 대하여 다시 뻗어나감
//여기부터는 DFS(i) 재귀 복귀주소라 다시 Back 작업
ch[i] = 0; //체크 해제 (다른 정점에 대하여 다시 시도해야 하므로)
}
}
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main1 T = new Main1();
Scanner kb = new Scanner(System.in);
//n, m 입력받고
n= kb.nextInt();
m= kb.nextInt();
//n+1 해주는 이유는 1~ 사용할 것이므로
graph = new int[n+1][n+1];
ch = new int[n+1] ; //체크용 동적 배열 생성시 0 초기화
//가선의 수 만큼 돌면서 간선 정보 임력받음
for(int i=0; i<m; i++) {
int a= kb.nextInt();
int b= kb.nextInt();
graph[a][b] = 1; //입력받은 각 정점의 정점 정보에 1 세팅
}
//일단 1은 무조건 '출발점'이므로 1체크
ch[1] = 1;
//1부터 보내서 DFS() 호출
T.DFS(1);
//정답 출력
System.out.println(answer);
}
}
7-12. 경로 탐색 (인접 리스트) | DFS
import java.util.ArrayList;
import java.util.Scanner;
/* 7-13. 경로탐색 (인접리스트, ArrayList)
* */
class Main2 {
static int n, m, answer =0 ;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch; //체크 배열
//DFS 함수
public void DFS(int v) {
if(v==n) answer++;
else {
//그래프 속 v번 정점에 연결된 nv 정점들 하나씩 가져옴
for(int nv : graph.get(v)) {
//방문 전인 정점에 대하여
if(ch[nv] == 0) {
ch[nv] = 1; //방문체크
DFS(nv);//해당 정점에 대해 다시 찾음
//복귀 후 back
ch[nv] = 0; //백 처리
}
}
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main2 T = new Main2();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
graph = new ArrayList<ArrayList<Integer>>();
//전체 크래프에 담을 각 정점 ArrayList 객체 생성
for(int i=0; i<=n; i++) {
//각 정점i들을 담을 ArrayList 생성
graph.add(new ArrayList<Integer>());
}
//체크용 배열 생성
ch=new int[n+1];
for(int i=0; i<m; i++) {
int a =kb.nextInt();
int b =kb.nextInt();
//각각의 정점 a 가져와서, 다시 add 연결정점 b담음
graph.get(a).add(b);
}
//최초 출발점 정점1 방문 세팅
ch[1] = 1;
T.DFS(1);
//출력
System.out.println(answer);
}
}
7-13. 그래프 최단 거리트) | BFS
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
/* 7-14. 그래프 최단 거리 (BFS) */
class Main3 {
static int n, m, answer =0 ;
static ArrayList<ArrayList<Integer>> graph;
static int[] ch, dis;//방문 체크용, 거리측정용
//BFS() 함수
public void BFS(int v) {
//큐 필요
Queue<Integer> queue = new LinkedList<>();
ch[v] = 1; //들어온 v에 대한 방문 체크
dis[v]= 0; //등로은 v에 대한 거리 일단 0 세팅
queue.offer(v);//큐에 담음
while(!queue.isEmpty()) {
//일단 큐 하나 뽑음
int cv = queue.poll();
//이 cv에 연결된 정점 탐색
for(int nv : graph.get(cv)) {
if(ch[nv] == 0){
ch[nv] =1;
queue.offer(nv);
dis[nv] = dis[cv]+1;//직전 cv의 거리+1
}
}
}
}
//실행 메인
public static void main(String[] args) {
// TODO Auto-generated method stub
Main3 T = new Main3();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
graph = new ArrayList<ArrayList<Integer>>();
//그래프 내부에 각 정점에 대한 정보 담을 ArrayList 객체 생성
for(int i=0; i<=n; i++) {
graph.add(new ArrayList<Integer>());
}
ch = new int[n+1];
dis = new int[n+1];
//각 정점a 대한 연결 b 정보 담음
for(int i=0; i<m; i++) {
int a = kb.nextInt();
int b = kb.nextInt();
graph.get(a).add(b);
}
//호출 2~n까지 최단거리 출력
T.BFS(1);
for(int i=2; i<=n; i++) {
System.out.println(i+" : "+dis[i]);
}
}
}
728x90
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 1' 카테고리의 다른 글
DFS, BFS 활용 섹션 - (2) (0) | 2023.03.24 |
---|---|
DFS, BFS 활용 섹션 - (1) (0) | 2023.03.23 |
DFS, BFS 개념 -(2) (0) | 2023.03.21 |
섹션 7. DFS, BFS 기초 섹션 - (2) DFS와 BFS (0) | 2023.03.20 |
섹션 7. DFS, BFS 기초 섹션 - (1) 재귀 함수와 DFS (0) | 2023.03.20 |