halang-log
💡 PS

[BOJ] 2637 장난감 조립

date
May 14, 2022
slug
boj-2637
author
status
Public
tags
PS
위상정렬
summary
장난감 조립 문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:27 AM
언어

문제

풀이

완제품을 시작점으로 보았다. 원래는 기본품 -> 중간품 -> 완제품 으로 화살표 방향이 이어지지만, 나는 완제품 -> 중간품 -> 기본품으로 본 것이다.
chk는 기본 부품 정보를 저장한 것이다. (0일 경우 기본 부품이다.)
v에 간선의 정보를 저장한다. 여기서 cost는 필요한 부품의 개수를 의미한다. 그리고 inDegree는 진입차수 정보이며 ans[i]는 완제품~i제품 까지 확인했을 때 필요한 기본 부품 개수이다.
go에서 topological sort를 진행한다. t에서 j.e로 가는데 만약 ans[t]가 0일 경우 j.cost를 넣어주고, 그게 아닐 경우 ans[t]*j.cost를 더해준다. 나머지는 위상정렬 풀이와 같으므로 생략하겠다.

코드

#include <cstdio> #include <queue> using namespace std; struct info { int cost, e; }; int n, m; vector<info> v[100]; int inDegree[100]; int chk[100]; int ans[100]; void go() { queue<int> q; q.push(n-1); for(int i = 0; i < n; i++) { int t = q.front(); q.pop(); for(auto j : v[t]) { if (ans[t] == 0) ans[j.e] = j.cost; else ans[j.e] += ans[t]*j.cost; if (--inDegree[j.e] == 0) q.push(j.e); } } } int main() { scanf("%d %d", &n, &m); int a, b, c; for(int i = 0; i < m; i++) { scanf("%d %d %d", &a, &b, &c); a--; b--; v[a].push_back({c, b}); inDegree[b]++; chk[a] = 1; } go(); for(int i = 0; i < n; i++) { if (chk[i] == 0) printf("%d %d\n", i+1, ans[i]); } }