BOJ::1389 케빈 베이컨의 6단계 법칙
https://www.acmicpc.net/problem/1389
알고리즘 분류에 dfs,bfs,플로이드 와샬 알고리즘 이라고 적혀있긴 한데
dfs로는 어떻게 푸는지 모르겠다.
쉽게 푸는건 플로이드 와샬 알고리즘 이고 이문제에서 속도 차이는 나지 않았다.
위가 플로이드 와샬, 아래가 bfs
<bfs를 이용 한 풀이>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; class Main{ static int n,m; static int map[][]=new int[101][101]; static boolean check[]; static int res[]=new int[101]; public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n=Integer.parseInt(st.nextToken()); m=Integer.parseInt(st.nextToken()); for(int i = 0 ; i < m ; i++){ st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); map[x][y]=1; map[y][x]=1; } for(int i =1 ; i<= n ;i++){ check = new boolean[n+1]; bfs(i); } int min = Integer.MAX_VALUE; for(int i=1;i<=n;i++){ if(res[i]<min){ min = res[i]; } } for(int i = 1 ; i<= n ; i++){ if(res[i]==min){ System.out.println(i); break; } } } //떨어진 거리를 체크하기 위해 Node 클래스를 만들었다 //dist = 떨어진 거리 //그래서 res 배열에 dist 만큼씩 더해주도록 만들어 보았다. public static void bfs(int v){ Queue<Node> q = new LinkedList(); check[v]=true; q.add(new Node(v,0)); while(!q.isEmpty()){ int x = q.peek().x; int dist = q.poll().dist; for(int i = 1 ; i<= n; i++){ if(map[x][i] ==1 && !check[i]){ q.add(new Node(i,dist+1)); check[i]=true; res[i]+=dist+1; } } } } } class Node{ int x; int dist; Node(int _x, int d){ x=_x; dist=d; } } | cs |
<플로이드 와샬 알고리즘을 이용한 풀이>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main{ static int n,m; static int map[][]=new int[101][101]; public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); n=Integer.parseInt(st.nextToken()); m=Integer.parseInt(st.nextToken()); for(int i = 1 ; i <= n ; i++){ for(int j = 1 ; j <= n ; j++){ map[i][j]=(i==j)?0:9999999; } } for(int i = 0 ; i < m ; i++){ st = new StringTokenizer(br.readLine()); int x = Integer.parseInt(st.nextToken()); int y = Integer.parseInt(st.nextToken()); map[x][y]=1; map[y][x]=1; } //각각 경로에 대해 최단경로를 만들어준다. //ex)1행 -> 1-1의 최단경로 1-2의 최단경로 1-3의 최단경로 1-4의 최단경로 ..... for(int k = 1 ; k<= n ; k++){ for(int i = 1 ; i <= n ; i++){ for(int j = 1 ; j <= n ; j++){ if(map[i][j]> map[i][k]+map[k][j]){ map[i][j]=map[i][k]+map[k][j]; } } } } int res[] = new int[n+1]; int min = Integer.MAX_VALUE; for(int i = 1 ; i<= n ; i++){ int sum=0; for(int j = 1 ; j<= n ; j++){ sum+=map[i][j]; } res[i]=sum; if(sum<min){ min = sum; } } for(int i = 1 ; i<= n ; i++){ if(res[i]==min){ System.out.println(i); break; } } } } | cs |
'BOJ::문제풀이' 카테고리의 다른 글
1475 방 번호 (0) | 2017.12.31 |
---|---|
1463 1로만들기 (0) | 2017.12.31 |
1325 효율적인 해킹 (0) | 2017.12.31 |
1309 동물원 (0) | 2017.12.31 |
1302 베스트 셀러 (0) | 2017.12.31 |