풀이
> distance 배열을 만들어서 노드의 레벨을 저장해두고, 다음 번 방문시 기존 레벨이 저장되어있으면 레벨 값을 바꾸지 않는다.
코드
import java.util.*;
/**
* 그래프에서 노드간 최소단거리 탐색 / 노드별 레벨 구하기
* 간선에 가중치 없음 (크루스칼 아님)
*
* 출발은 항상 1번
* 출발지 1번을 제외한 나머지 노드로 가는 최소값을 가진 배열 return
*
*/
public class graphSrch {
public void solution(int[] n, int[][] edges) {
boolean[] ck = new boolean[n.length];
List[] link = new List[n.length];
int[] distance = new int[n.length];
Stack<Integer> st = new Stack<Integer>();
Queue<Integer> q = new LinkedList<>();
int cur = 0;
int end = 0;
int cnt = 0; //레벨
//거리 초기화
for(int i =1; i<distance.length; i++){
distance[i] = n.length;
}
for (int i = 1; i < link.length; i++) {
link[i] = new ArrayList<Integer>();
}
//간선 연결 작업
for (int i = 0; i < edges.length; i++) {
link[edges[i][0]].add(edges[i][1]);
link[edges[i][1]].add(edges[i][0]);
}
//BFS 풀이
ck = new boolean[n.length];
cnt = 0;
//end = i;
//출발은 항상 1
q.add(n[1]);
while(!q.isEmpty()){
cur = q.peek();
q.poll();
if(cnt<distance[cur]){
distance[cur] = cnt;
}
//노드 방문하지 않은 경우
if(!ck[cur]){
//방문 체크
System.out.println("방문노드 : "+cur+" 현재 level :"+cnt);
ck[cur] = true;
//방문지점에서 갈 수 있는 다음 level add
for(int j=0; j<link[cur].size(); j++){
cnt = distance[cur];
if(!ck[(int)link[cur].get(j)]){
//다음 방문할 노드기 떄문에, 거리는 현재 거리+1, 다음 방문지가 현재 거리보다 큰 경우만 변경함
if((cnt+1)<distance[(int)link[cur].get(j)]){
distance[(int)link[cur].get(j)] = cnt+1;
}
System.out.println("next = "+link[cur].get(j));
q.add((int)link[cur].get(j));
}
}
cnt++; // 레벨 증가
}
}
System.out.println(end+"방문 최솟값 : "+cnt);
for(int i=1; i<distance.length; i++){
System.out.println(i +" = "+ distance[i]);
}
}
public static void main(String[] args) {
graphSrch tc = new graphSrch();
int[] n = {0,1,2,3,4,5,6};
// int[][] edges = {{1,3},{1,4},{2,1},{2,5},{3,4},{4,5},{4,6},{6,5},{6,2}};
int[][] edges = {{1,2},{1,4},{1,6},{2,4},{2,5},{4,5},{5,6},{5,2},{6,3}};
tc.solution(n,edges);
}
}
'알고리즘 공부 > 알고리즘 개념' 카테고리의 다른 글
분할 정복(Divide and conquer), 동적 계획법(Dynamic Programming), 그리디(Greedy) 개념정리 (0) | 2022.09.13 |
---|---|
BFS 알고리즘 개념 (1) | 2019.06.03 |
Kruskal (크루스칼) 알고리즘 (0) | 2019.05.31 |
Union Find 알고리즘 (0) | 2019.05.29 |
트리 구현 - 인접행렬, 인접리스트 (0) | 2019.04.08 |