2050.Β Parallel Courses III

  • μˆ˜μ—… λ³„λ‘œ μ‹œκ°„ 및 의쑴 관계가 μ‘΄μž¬ν•  λ•Œ κ°€μž₯ 짧은 μ‹œκ°„μ— λͺ¨λ“  μˆ˜μ—…μ„ μ™„λ£Œν•  수 μžˆλŠ” 경우λ₯Ό μ°ΎλŠ” 문제.
    • μˆ˜μ—…μ€ λ…Έλ“œλ‘œ ν‘œν˜„λ˜λ©° 의쑴 κ΄€κ³„λŠ” κ·Έλž˜ν”„μ˜ μ„ μœΌλ‘œ ν‘œν˜„λœλ‹€.
  • 의쑴 관계λ₯Ό 인접 리슀트둜 κ΅¬μ„±ν•˜λ˜ λ°©ν–₯을 λ°˜λŒ€λ‘œ ν•œλ‹€.
  • λͺ¨λ“  λ…Έλ“œ 쀑 루트 λ…Έλ“œ (λ§ˆμ§€λ§‰ μˆ˜μ—…)λ₯Ό κ΅¬ν•˜κ³  각 루트 λ…Έλ“œλ³„λ‘œ νƒμƒ‰ν•˜μ—¬ 총 μˆ˜μ—…μ„ λ“£λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ„ κ΅¬ν•˜μ—¬ map dp에 μ €μž₯ν•œλ‹€.
  • λͺ¨λ“  경둜 쀑 κ°€μž₯ 큰 값이 λͺ¨λ“  μˆ˜μ—…μ„ μ™„λ£Œν•˜λŠ”λ° λ“œλŠ” μ‹œκ°„μ΄λ‹€.
class Solution { public: void traverse(map<int,vector<int>>& adj, vector<int>& time, map<int,int>& dp, int i, int prev) { int nTime = prev + time[i-1]; if (nTime < dp[i]) return; dp[i] = nTime; for (auto& j : adj[i]) { traverse(adj, time, dp, j, nTime); } } int minimumTime(int n, vector<vector<int>>& relations, vector<int>& time) { map<int,vector<int>> adj; set<int> leaf; for (int i = 1; i <= n; ++i) { leaf.insert(i); } for (auto& e : relations) { adj[e[1]].push_back(e[0]); leaf.erase(e[0]); } map<int,int> dp; int result = 0; for (auto i : leaf) { traverse(adj, time, dp, i, 0); } for (auto entry : dp) { result = max(result, entry.second); } return result; } };