ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]10282: 해킹 - JAVA
    문제풀이/백준 2021. 4. 29. 17:41

    [백준]10282: 해킹

    www.acmicpc.net/problem/10282

     

    10282번: 해킹

    최흉최악의 해커 yum3이 네트워크 시설의 한 컴퓨터를 해킹했다! 이제 서로에 의존하는 컴퓨터들은 점차 하나둘 전염되기 시작한다. 어떤 컴퓨터 a가 다른 컴퓨터 b에 의존한다면, b가 감염되면

    www.acmicpc.net

    풀이

    서로 의존성을 가지고 연결된 컴퓨터들 끼리 전염이 되는데 최대 전염 컴퓨터의 수와 전염될 수 있는 컴퓨터가 모두 전염되었을 때의 시간을 반환하는 문제이다.

     

    첫 시작 컴퓨터를 기준으로 다른 모든 컴퓨터가 전염되는 시간을 구하는 문제임으로 다익스트라 알고리즘을 사용하여 문제를 풀었당.

     

    다익스트라 알고리즘을 실행한 후 dist함수에서 Integer.MAX_VALUE값이 아닌 값 중 최대 값을 찾아주었고 해당 값이 문제에서 요구하는 시간에 대한 정보이다.

     

    컴퓨터 수는 다익스트라 알고리즘 내부에서 방문한 노드가 아닐 때마다 count해 주어서 구하였다. 

     

    코드

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    import java.util.*;
     
    public class Main {
        
        static int n, d, c;
        static ArrayList<Node>[] list;
        static int count;
        static boolean[] visited;
        static int[] dist;
        
        public static void main(String[] args) {
            Scanner scan = new Scanner(System.in);
            
            int t = scan.nextInt();
            for(int i = 0; i < t; i++) {
                n = scan.nextInt();
                d = scan.nextInt();
                c = scan.nextInt();
                
                list = new ArrayList[n + 1];
                for(int j = 1; j <= n; j++) {
                    list[j] = new ArrayList<>();
                }
                
                for(int j = 0; j < d; j++) {
                    int a = scan.nextInt();
                    int b = scan.nextInt();
                    int s = scan.nextInt();
                    list[b].add(new Node(a, s));
                }
                
                count = 0;
                dist = new int[n + 1];
                visited = new boolean[n + 1];
                
                Arrays.fill(dist, Integer.MAX_VALUE);
                dist[c] = 0;
                
                dijkstra();
                int time = 0;
                for(int j = 1; j <= n; j++) {
                    if(dist[j] != Integer.MAX_VALUE) time = Math.max(time, dist[j]);
                }
                
                System.out.println(count + " " + time);
            }
        }
        
        public static void dijkstra() {
            PriorityQueue<Node> q = new PriorityQueue<>();
            q.offer(new Node(c, 0));
            
            while(!q.isEmpty()) {
                Node current = q.poll();
                
                if(visited[current.n] == false) {
                    visited[current.n] = true;
                    count++;
                }
                else continue;
                
                for(int i = 0; i < list[current.n].size(); i++) {
                    Node next = list[current.n].get(i);
                    if(dist[next.n] > dist[current.n] + next.s) {
                        dist[next.n] = dist[current.n] + next.s;
                        q.offer(new Node(next.n, dist[next.n]));
                    }
                }
            }
        }
        
        public static class Node implements Comparable<Node> {
            int n;
            int s;
            
            public Node(int n, int s) {
                this.n = n;
                this.s = s;
            }
            
            @Override
            public int compareTo(Node n) {
                return this.s - n.s;
            }
        }
    }
     
    cs

    '문제풀이 > 백준' 카테고리의 다른 글

    [백준]1092: 배 - JAVA  (0) 2021.04.30
    [백준]2056: 작업 - JAVA  (0) 2021.04.30
    [백준]4358: 생태학 - JAVA  (0) 2021.04.29
    [백준]6416: 트리인가? - JAVA  (1) 2021.04.28
    [백준]1202: 보석 도둑 - JAVA  (1) 2021.04.27

    댓글

Designed by Tistory.