๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1516 ๊ฒŒ์ž„ ๊ฐœ๋ฐœ

by Jouureee 2022. 3. 3.

๋ฌธ์ œ :

https://www.acmicpc.net/problem/1516

 

1516๋ฒˆ: ๊ฒŒ์ž„ ๊ฐœ๋ฐœ

์ฒซ์งธ ์ค„์— ๊ฑด๋ฌผ์˜ ์ข…๋ฅ˜ ์ˆ˜ N(1 ≤ N ≤ 500)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๊ฑด๋ฌผ์„ ์ง“๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ๊ทธ ๊ฑด๋ฌผ์„ ์ง“๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•˜๋Š” ๊ฑด๋ฌผ๋“ค์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฑด๋ฌผ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€

www.acmicpc.net

 

ํ’€์ด :

๋จผ์ € ๊ฐœ๋ฐœํ•  ๊ฒƒ์ด ์žˆ๋‹ค๋Š” ์ ์—์„œ ์œ„์ƒ ์ •๋ ฌ ๋ฌธ์ œ๋‹ค. ๐Ÿ‘‰๐Ÿป ์œ„์ƒ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ž์‹ ์˜ ๋…ธ๋“œ๋กœ ํ–ฅํ•˜๋Š” ๋‹ค๋ฅธ ๋…ธ๋“œ๊ฐ€ ์žˆ์„๋•Œ ๊ทธ ๋…ธ๋“œ๋ฅผ v[์ž์‹ ].push_back(ํ–ฅํ•˜๋Š” ๋…ธ๋“œ)๋กœ ๋„ฃ์–ด์คฌ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ–ฅํ•˜๋Š” ๋“ค์–ด์˜ค๋Š” ๋…ธ๋“œ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ์คฌ๋‹ค. (๊ฐœ๋…๊ณผ ๋ฐ˜๋Œ€๋‹ค) ์ฆ‰ indegeree[ํ–ฅํ•˜๋Š”๋…ธ๋“œ]++

 

๋”ฐ๋ผ์„œ ๊ฐ’์„ ๋„์‹ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 ๊ทธ๋ฆฌ๊ณ  indegree๊ฐ€ 0์ธ ๊ฐ’๋ถ€ํ„ฐ vector ๋ฐฐ์—ด๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋Œ์•„ index์— ํ•ด๋‹นํ•˜๋Š” vector ๊ฐ’์— index์˜ ๊ฑด์ถ• ์‹œ๊ฐ„์„ ๋”ํ•ด์ค€๋‹ค.

ํ˜„์žฌ q์—๋Š” indegree๊ฐ€ 0์ธ 1๋งŒ ์žˆ๋‹ค. 

1์€ 2, 3, 4 ํ•˜์œ„ ๋…ธ๋“œ๋ฅผ ๊ฐ๊ฐ ๋Œ๋ฉด์„œ

2๋ฒˆ ๋…ธ๋“œ = 2๋ฒˆ ์ž์‹  + 1๋ฒˆ ๋…ธ๋“œ ๊ฐ’

3๋ฒˆ ๋…ธ๋“œ = 3๋ฒˆ ์ž์‹  + 1๋ฒˆ ๋…ธ๋“œ ๊ฐ’

4๋ฒˆ ๋…ธ๋“œ = 4๋ฒˆ ์ž์‹  + 1๋ฒˆ ๋…ธ๋“œ ๊ฐ’

๊ฐ’์„ ๋ฐ›์•„ sum ๋ฐฐ์—ด์— ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

 

์›๋ž˜ ์œ„์ƒ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์‚ฌ์ดํด์ด ์กด์žฌํ•ด์„  ์•ˆ๋œ๋‹ค .. ! ๊ทผ๋ฐ ์ด ๋ฌธ์ œ๋Š” ์‚ฌ์ดํด์ด ์กด์žฌํ•œ๋‹ค. ์ฆ‰ 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ์ง“๊ธฐ ์œ„ํ•ด์„œ 1๋ฒˆ์„ ๋จผ์ € ์ง€์„ ์ˆ˜ ๋„ ์žˆ๋Š”๊ฑฐ๊ณ , ์•„๋‹ˆ๋ฉด 1-3์„ ๊ฑฐ์ณ 4๋ฒˆ์„ ์ง€์„ ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๊ฑฐ(Or)๊ฐ€ ์•„๋‹ˆ๋ผ ๋‘˜๋‹ค ๋จผ์ € ์ง€์–ด์ ธ์•ผ ํ•œ๋‹ค(And) ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ + ์ž๊ธฐ ์‹œ๊ฐ„์œผ๋กœ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.

 

c++ ์ฝ”๋“œ

//
//  1516_gameDev.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2022/03/03.
//

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

using namespace std;
int N;
vector<int> v[501];
int indegree[501];
int buildTime[501];
int sum[501];
queue<int> q;

int main(){
    
    for(int i = 1; i <= N; i++){
        indegree[i] = 0; // ์ดˆ๊ธฐํ™”
        sum[i] = 0;
    }
    
    cin >> N;
    for(int i = 1; i <= N; i++){
        cin >> buildTime[i];
        int b;
        while(1){
            cin >> b;
            if(b == -1) break;
            v[b].push_back(i);
            indegree[i]++; // ์œ„์ƒ ์ฆ๊ฐ€
        }
        
    }
    
    for(int i = 1; i <= N; i++){
        if(indegree[i] == 0){
            q.push(i);
            sum[i] = buildTime[i];
        }
    }
    
    while(!q.empty()){
        int top = q.front();
        q.pop();
        for(int i = 0; i < v[top].size(); i++){
            int next = v[top][i];
            if(--indegree[next] == 0) { q.push(next); }
            sum[next] = max(sum[next], buildTime[next] + sum[top]);

        }
        
    }
    
    for(int i = 1; i <= N; i++){
        cout << sum[i] << '\n';
    }
    
    
    
    
    return 0;
}

๋Œ“๊ธ€