반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 손에 잡히는 경제 요약
- 손경제 요약
- 주식 상한가
- 경제뉴스 요약
- 백준
- 이진우
- 상한가 분석
- 이진우의 손에 잡히는 경제
- java
- 테마주
- 코테
- Python
- 경제뉴스
- 경제
- 자바
- 손경제
- 급등 이유
- 주식 분석
- 상한가 이유
- 급등주 분석
- boj
- 코딩테스트
- 상한가
- 프로그래머스
- 파이썬
- Programmers
- 손에 잡히는 경제
- 급등주
- 알고리즘
- 주식
Archives
- Today
- Total
Completion over Perfection
백준 10282 - 해킹 (JAVA) 본문
반응형
다익스트라로 풀었습니다.
풀이방법은 아래에 자세하게 적겠습니다.
변수설명
INF : 가장 큰 임의의 숫자 (dist배열에 갱신되기 전 초기에 임시로 넣어주기 위함)
dist[] : 컴퓨터를 최소시간 감염을 저장할 배열
list[] : 각 연결된 노드의 정보를 담을 배열
n : 컴퓨터의 갯수
d : 연결된 노드정보의 갯수
t : 테스트 케이스의 갯수
c : 처음 감염이 된 컴퓨터의 번호
1. b가 a에 의존한다고 되어있으므로, start와 end를 반대로 넣어줘야 제대로 동작한다.
2. INF으로 입력되어 있는 애들은 감염되지 않은 애들이므로, 감염된 컴퓨터를 더해줄 때 제외해야된다.
3. 어느 컴퓨터가 마지막에 감염되었는지는 알 수 없으므로, 전체 dist[] 리스트를 처음부터 돌면서 가장 큰 숫자를 출력해주면 걔가 마지막에 감염된 컴퓨터가 된다.
4. 출력해줄때는 "\n"을 마지막에 꼭 붙여넣어주자. 이걸 안써서 오답을 두번 제출했다 ㅠ.ㅠ
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
import java.io.*;
import java.util.*;
class Node implements Comparable<Node>{
int end, weight;
public Node(int end, int weight){
this.end = end;
this.weight = weight;
}
@Override
public int compareTo(Node o){
return weight - o.weight;
}
}
public class BJ_Hacking {
static final int INF = 99999999;
static int dist[];
static List<Node> [] list;
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static int n,d,c,t;
public static int stoi(String s){return Integer.parseInt(s);}
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
t = stoi(st.nextToken()); // 2
for(int test_case=1; test_case<=t; test_case++){
StringTokenizer s = new StringTokenizer(br.readLine());
n = stoi(s.nextToken()); // 3
d = stoi(s.nextToken()); // 2
c = stoi(s.nextToken()); // 2
list = new ArrayList[n+1];
dist = new int[n+1];
Arrays.fill(dist, INF);
for(int i=1; i<=n; i++){
list[i] = new ArrayList<>();
}
for(int i=1; i<=d; i++){
StringTokenizer ss = new StringTokenizer(br.readLine());
int end = stoi(ss.nextToken());
int start = stoi(ss.nextToken());
int weight = stoi(ss.nextToken());
list[start].add(new Node(end,weight));
}
daik(c);
StringBuilder sb = new StringBuilder();
int wasted_computer = 0;
int max = -1;
for(int i=1; i<=n; i++){
if(dist[i] == INF){
continue;
}else{
wasted_computer++;
max = Math.max(max,dist[i]);
}
}
sb.append(wasted_computer + " " + max + "\n");
bw.write(sb.toString());
bw.flush();
}
}
public static void daik(int start){
PriorityQueue<Node> pq = new PriorityQueue();
boolean visits[] = new boolean[n+1];
dist[start] = 0;
pq.add(new Node(start, 0));
while(!pq.isEmpty()){
Node curnode = pq.poll();
int next = curnode.end;
if (visits[next]) continue;
visits[next] = true;
for(Node node: list[next]) {
if (dist[node.end] > dist[next] + node.weight){
dist[node.end] = dist[next] + node.weight;
pq.add(new Node(node.end, dist[node.end]));
}
}
}
}
}
|
cs |
반응형
Comments