λ°±μ€€/C++

[λ°±μ€€/C++] 2056번 μž‘μ—…

yulee_to 2022. 7. 16. 19:39

λ°±μ€€

 


πŸ€”λ¬Έμ œ 이해

μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 μžˆμ–΄ μˆœμ„œκ°€ 있고 λ™μ‹œμ— μˆ˜ν–‰μ΄ κ°€λŠ₯ν•  λ•Œ, μˆœμ„œλŒ€λ‘œ λͺ¨λ“  μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.


πŸ’‘μ²«λ²ˆμ§Έ 아이디어

μœ„μƒμ •λ ¬ 문제둜 λ™μ‹œμ— μˆ˜ν–‰λ˜λŠ” μž‘μ—…μ΄ 있고 선행에 μžˆλŠ” μž‘μ—…μ„ λͺ¨λ‘ μˆ˜ν–‰ν–ˆμ„ λ•Œ λ‹€μŒ μž‘μ—… μˆ˜ν–‰μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ priority queueλ₯Ό μ‚¬μš©ν•΄μ•Όκ² λ‹€κ³  μƒκ°ν–ˆλ‹€.

 

πŸ”₯풀이πŸ”₯

1. pq에 in_degreeκ°€ 0인 정점을 λ‹€ λ„£μ–΄μ€€λ‹€.

2. ν˜„μž¬ pq의 top의 μ‹œκ°„μ„ time값에 더해주고 pop을 ν•΄μ€€λ‹€.

3. pq에 남아 μžˆλŠ” μž‘μ—…λ“€μ—μ„œ top의 μ‹œκ°„μ„ λΉΌμ£Όκ³  κ·Έ 값듀을 tmpλΌλŠ” μž„μ‹œ queue에 λ„£μ–΄μ€€λ‹€.

4. tmp에 λ“€μ–΄μžˆλŠ” 값듀을 ν•˜λ‚˜μ”© λΉΌμ„œ pq에 λ„£μ–΄μ€€λ‹€.

5. top의 λ‹€μŒμ— μˆ˜ν–‰λ  수 μžˆλŠ” μž‘μ—…λ“€μ˜ in_degreeλ₯Ό -1 해쀬을 λ•Œ in_degree 값이 0이라면 pq에 λ„£μ–΄μ€€λ‹€.

6. 2~5번 μž‘μ—…μ„ λ°˜λ³΅ν•˜λ‹€κ°€ pqκ°€ λΉ„μ—ˆμ„ λ•Œ while문을 λΉ μ Έλ‚˜μ™€ time값을 좜λ ₯ν•΄μ€€λ‹€.

 

βŒνŠΈλŸ¬λΈ” μŠˆνŒ…

값이 μ œλŒ€λ‘œ λ‚˜μ™”κΈ°μ— μ–΄λ””μ„œ 잘λͺ»λœκ±΄μ§€ κ°€λŠ μ΄ μ•ˆλλ‹€. κ·ΈλŸ¬λ‹€κ°€ ν’€μ΄μ—μ„œμ˜ 3번 과정을 μˆ˜ν–‰ν•  λ•Œ pq.size()둜 μˆ˜ν–‰ν•΄μ„œ κ·Έ κ³Όμ •μ—μ„œ μƒˆλ‘œ λ“€μ–΄κ°„ pq μ›λž˜ pq에 λ‚¨μ•„μžˆλ˜ κ°’λ“€μ˜ μ‹œκ°„λ³΄λ‹€ μž‘μ•„μ„œ λ‚΄κ°€ μ›ν•˜λŠ” κ°’λ“€λ§Œ λ½‘μ•„λ‚΄μ„œ μ‹œκ°„μ„ μ—…λ°μ΄νŠΈν•΄ 쀄 수 μ—†μ—ˆλ‹€. 


#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int n;
vector<vector<int>> v;
int in_degree[10003];
int cost[10003];
queue<pair < int, int>>
tmp;

int main() {
    cin.tie(nullptr);
    cout.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> n;
    v.resize(n + 2);

    int a, b;
    for (int i = 1; i <= n; i++) {
        cin >> cost[i] >> a;
        for (int j = 0; j < a; j++) {
            cin >> b;
            v[b].push_back(i);
            in_degree[i]++;
        }
    }

    priority_queue<pair < int, int>>
    pq;
    for (int i = 1; i <= n; i++) {
        if (in_degree[i] == 0) {
            pq.push({-cost[i], i});
        }
    }
    int time = 0;
    while (!pq.empty()) {
        int now_cost = -pq.top().first;
        int now = pq.top().second;
        int size = pq.size();
        pq.pop();
        time += now_cost;

        for (int i = 0; i < size - 1; i++) {
            int same_time_cost = -pq.top().first - now_cost;
            int same_time_vertex = pq.top().second;
            pq.pop();
            tmp.push({same_time_cost, same_time_vertex});
        }
        while (!tmp.empty()) {
            pq.push({-tmp.front().first, tmp.front().second});
            tmp.pop();
        }
        

        for (int next: v[now]) {
            in_degree[next]--;
            if (in_degree[next] == 0) {
                pq.push({-cost[next], next});
            }
        }
    }
    cout << time;

}

 

πŸ”—μ°Έκ³ ν•  문제

거의 같은 문제라고 봐도 무방..!

 

[λ°±μ€€/C++] 2098번 μ™ΈνŒμ› 순회

πŸ€”λ¬Έμ œ 이해 λͺ¨λ“  λ„μ‹œλ₯Ό 거치고 λ‹€μ‹œ 처음 λ„μ‹œλ‘œ λŒμ•„μ˜€λŠ” λͺ¨λ“  경둜 쀑 λΉ„μš©μ΄ κ°€μž₯ 적게 λ“œλŠ” 경둜의 λΉ„μš©μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€. πŸ’‘μ²«λ²ˆμ§Έ 아이디어 κ·Έλƒ₯ μˆœμ—΄μ„ κ΅¬ν•΄μ„œ ν’€λ©΄ μ΅œλŒ€ 16! =20,922,7

yulee.tistory.com

 

728x90