๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 14267๋ฒˆ - ํšŒ์‚ฌ ๋ฌธํ™”1

by ์•ˆ์ฃผํ˜• 2022. 8. 15.

๋ฌธ์ œ

 

14267๋ฒˆ: ํšŒ์‚ฌ ๋ฌธํ™” 1

์˜์„ ํšŒ์‚ฌ์—๋Š” ๋งค์šฐ ์ข‹์€ ๋ฌธํ™”๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ƒ์‚ฌ๊ฐ€ ์ง์† ๋ถ€ํ•˜๋ฅผ ์นญ์ฐฌํ•˜๋ฉด ๊ทธ ๋ถ€ํ•˜๊ฐ€ ๋ถ€ํ•˜์˜ ์ง์† ๋ถ€ํ•˜๋ฅผ ์—ฐ์‡„์ ์œผ๋กœ ์นญ์ฐฌํ•˜๋Š” ๋‚ด๋ฆฌ ์นญ์ฐฌ์ด ์žˆ๋‹ค. ์ฆ‰, ์ƒ์‚ฌ๊ฐ€ ํ•œ ์ง์† ๋ถ€ํ•˜๋ฅผ ์นญ์ฐฌํ•˜๋ฉด ๊ทธ ๋ถ€ํ•˜

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>

using namespace std;

vector<int>graph[100001];
int point[100001];

void add_point(int node, int _point){
    point[node] += _point;
    for(auto next: graph[node]){
        add_point(next, point[node]);
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int n, m; cin>>n>>m;
    for(int i=1; i<=n; i++){
        int inp; cin>>inp;
        if(inp==-1) continue;
        graph[inp].push_back(i);
    }
    
    for(int i=0; i<m; i++){
        int peo, cost; cin>>peo>>cost;
        point[peo] += cost;  // peo: ์ง์›๋ฒˆํ˜ธ, cost: ์นญ์ฐฌ์ •๋„
    }
    
    add_point(1, point[1]);
    
    for(int i=1; i<=n; i++){
        cout<<point[i]<<' ';
    }
}

 

ํ’€์ด

์ž์‹ ์ด ์นญ์ฐฌ๋ฐ›์œผ๋ฉด ์ž์‹ ๋ณด๋‹ค ์•„๋ž˜ ์ง์œ„๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์ง์›์˜ ์นญ์ฐฌ ์ ์ˆ˜ ๋˜ํ•œ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฏธ๋ฆฌ ์ง์›๋“ค์ด ์นญ์ฐฌ๋ฐ›์€ ์ •๋„๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , dfs๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋Œ๋ฆฌ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋ฏธ๋ฆฌ ์ง์›๋“ค์ด ๋ฐ›์€ ์นญ์ฐฌ ์ •๋„๋ฅผ ์ž…๋ ฅ๋ฐ›์ง€ ์•Š๊ณ  ์ž…๋ ฅ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค dfs๋ฅผ ๋Œ๋ ค ์ ์ˆ˜๋ฅผ ๋”ํ•ด์ค€๋‹ค๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. ์นญ์ฐฌ๋ฐ›์€ ์ •๋„๋ฅผ ๋จผ์ € ์ €์žฅํ•œ๋‹ค.
  2. dfs๋ฅผ 1๋ฒˆ ์ง์›์„ ์‹œ์ž‘์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ๋ณธ์ธ์ด ๋ฐ›์€ ์นญ์ฐฌ ์ ์ˆ˜๋ฅผ ๋”ํ•œ๋‹ค.
  3. ๋ณธ์ธ ์•„๋ž˜์˜ ์ง์›๋“ค์˜ dfs๋ฅผ ๋Œ๋ฆฌ๋Š”๋ฐ, ์•„๋ž˜์˜ ์ง์›์€ ๋ณธ์ธ ์ƒ์‚ฌ๊ฐ€ ๋ฐ›์€ ์ ์ˆ˜๋ฅผ ๋”ํ•œ๋‹ค.

๋Œ“๊ธ€