728x90
반응형
https://www.acmicpc.net/problem/2637
2637번: 장난감 조립
첫째 줄에는 자연수 N(3 ≤ N ≤ 100)이 주어지는데, 1부터 N-1까지는 기본 부품이나 중간 부품의 번호를 나타내고, N은 완제품의 번호를 나타낸다. 그리고 그 다음 줄에는 자연수 M(3 ≤ M ≤ 100)이 주
www.acmicpc.net
문제 해결
- 위상정렬 문제라는 것을 쉽게 알 수 있다.
- 가장 마지막에 완제품 n이 오므로 n부터 시작해서 앞에 제품들을 조사한다.
CODE
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<pair<int, int>> adj[101];
int in[101], cnt[101];
int main() {
int n;
cin >> n;
int m;
cin >> m;
for (int i = 0; i < m; i++) {
int x, y, k;
cin >> x >> y >> k;
adj[x].push_back({ y, k });
in[y]++;// y 앞에 있는 숫자 개수
}
vector<int> ans;
queue<int> que;
que.push(n);
cnt[n] = 1; // n은 첫 번째이므로 1
while (!que.empty()) {
int cur = que.front(); que.pop();
if (adj[cur].empty()) {
ans.push_back(cur);
}
for (auto p : adj[cur]) {
int nxt = p.first;
int c = p.second;
cnt[nxt] += cnt[cur] * c;
if (--in[nxt] == 0) que.push(nxt);
}
}
sort(ans.begin(), ans.end());
for (auto k : ans) cout << k << ' ' << cnt[k] << '\n';
return 0;
}
728x90
반응형
'알고리즘 > [C++] 백준 BOJ' 카테고리의 다른 글
[C++] 백준 6131 완전 제곱수 (2) | 2023.11.20 |
---|---|
[C++] 백준 17427 약수의 합 2 (0) | 2023.10.31 |
[C++] 백준 3059 등장하지 않는 문자의 합 (0) | 2023.10.15 |
[C++] 백준 10451 순열 사이클 (0) | 2023.09.03 |
[C++] 백준 14719 빗물 (0) | 2023.08.29 |
댓글