컴퓨팅적 사고
이 문제의 가장 핵심포인트는 비행기의 종류를 구하는것이다.
- 비행기의 종류를 구하는것이 결국 간선의 개수가 몇개인것인지에 대한 문제이다. 즉, n-1이다
- 다른방식으로는 bfs로 체크되지 않은정점과 값이 있는 정점을 방문할 수 있을때마다 answer를 카운팅시켜주면서 가능한 모든 비행기 종류를 체크합니다.
소스코드
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
| public class boj_9372 { static int INF = (int)1e9; static int[][] map; static boolean[] isChecked; static int n,m; static int answer = 0; public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); StringTokenizer st;
while(t-- > 0){ st = new StringTokenizer(br.readLine()); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); isChecked = new boolean[n+1]; answer = 0; map = new int[n+1][n+1]; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ map[i][j] = INF; if(i == j) map[i][j] = 0; } } 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; } bfs(); System.out.println(answer-1); } } private static void bfs() { Queue<Integer> queue = new LinkedList<>(); queue.add(1); isChecked[1] = true; while(!queue.isEmpty()) { answer++; int x = queue.poll(); for(int i=1; i<=n; i++) { if(map[x][i]!=0 && !isChecked[i]) { isChecked[i] = true; queue.add(i); } } } } }
|