1
+ import java .io .*;
2
+ import java .util .*;
3
+
4
+ class HW_5021_2 {
5
+ static Map <String , List <String >> graph = new HashMap <>(); // λΆλͺ¨ μ 보λ₯Ό μ μ₯νλ κ·Έλν
6
+ static Map <String , Double > blood = new HashMap <>(); // νν΅ λΉμ¨ μ μ₯
7
+ static String king ; // μμ‘° μ°½μμ
8
+
9
+ public static void main (String [] args ) throws IOException {
10
+ BufferedReader br = new BufferedReader (new InputStreamReader (System .in ));
11
+ StringTokenizer st = new StringTokenizer (br .readLine ());
12
+
13
+ int N = Integer .parseInt (st .nextToken ()); // κ°μ‘± κ΄κ³ κ°μ
14
+ int M = Integer .parseInt (st .nextToken ()); // ν보 μ
15
+ king = br .readLine (); // μμ‘° μ°½μμ μ΄λ¦
16
+
17
+ blood .put (king , 1.0 ); // μ°½μμμ νν΅ νλ₯ μ 1.0
18
+
19
+ // κ·Έλν λ° νν΅ μ΄κΈ°ν
20
+ for (int i = 0 ; i < N ; i ++) {
21
+ st = new StringTokenizer (br .readLine ());
22
+ String child = st .nextToken ();
23
+ String parent1 = st .nextToken ();
24
+ String parent2 = st .nextToken ();
25
+
26
+ // λΆλͺ¨ μ°κ²° μ 보 μ μ₯ (μμ -> λΆλͺ¨ 리μ€νΈ)
27
+ graph .putIfAbsent (parent1 , new ArrayList <>());
28
+ graph .putIfAbsent (parent2 , new ArrayList <>());
29
+ graph .putIfAbsent (child , new ArrayList <>());
30
+ graph .get (child ).add (parent1 );
31
+ graph .get (child ).add (parent2 );
32
+
33
+ // νν΅ μ 보 μ΄κΈ°ν (μλ€λ©΄ 0.0)
34
+ blood .putIfAbsent (parent1 , 0.0 );
35
+ blood .putIfAbsent (parent2 , 0.0 );
36
+ blood .putIfAbsent (child , 0.0 );
37
+ }
38
+
39
+ // BFSλ₯Ό ν΅ν΄ νν΅ νλ₯ κ³μ°
40
+ bfs ();
41
+
42
+ // μμ κ³μΉμ μ°ΎκΈ°
43
+ String successor = "" ;
44
+ double maxBlood = -1.0 ;
45
+
46
+ for (int i = 0 ; i < M ; i ++) {
47
+ String candidate = br .readLine ();
48
+ if (blood .containsKey (candidate ) && blood .get (candidate ) > maxBlood ) {
49
+ maxBlood = blood .get (candidate );
50
+ successor = candidate ;
51
+ }
52
+ }
53
+
54
+ System .out .println (successor );
55
+ }
56
+
57
+ // BFSλ₯Ό μ΄μ©ν νν΅ νλ₯ κ³μ°
58
+ private static void bfs () {
59
+ Queue <String > queue = new LinkedList <>();
60
+
61
+ // μ°½μμ(μμ‘° μμ μΈλ¬Ό)λΆν° μμ
62
+ queue .add (king );
63
+
64
+ while (!queue .isEmpty ()) {
65
+ String person = queue .poll ();
66
+
67
+ if (!graph .containsKey (person )) continue ; // λΆλͺ¨κ° μλ κ²½μ° μ€ν΅
68
+
69
+ for (String child : graph .keySet ()) {
70
+ List <String > parents = graph .get (child );
71
+ if (parents .size () < 2 ) continue ; // λΆλͺ¨κ° μμΌλ©΄ 무μ
72
+
73
+ double parent1Blood = blood .getOrDefault (parents .get (0 ), 0.0 );
74
+ double parent2Blood = blood .getOrDefault (parents .get (1 ), 0.0 );
75
+
76
+ double newBlood = (parent1Blood + parent2Blood ) / 2.0 ;
77
+
78
+ if (newBlood > blood .get (child )) { // μλ‘μ΄ νν΅μ΄ λ ν¬λ©΄ κ°±μ
79
+ blood .put (child , newBlood );
80
+ queue .add (child ); // νν΅μ΄ κ°±μ λ κ²½μ° μμμ νμ μΆκ°
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
0 commit comments