[BOJ] 장난감 조립
Date:
[BOJ] 장난감 조립
Problem URL : 장난감 조립
# include <iostream>
# include <cstring>
# include <vector>
# include <algorithm>
# include <queue>
using namespace std;
int n, m;
vector <vector<pair<int, int>>> composition;
int degree[101];
int need[101][101];
int main() {
cin >> n >> m;
int x, y, z;
composition.resize(n + 1);
memset(degree, 0, sizeof(degree));
memset(need, 0, sizeof(need));
while (m--) {
cin >> x >> y >> z;
composition[y].push_back(make_pair(x,z)); // x를 만드는데 부품 y가 z개 필요
degree[x]++;
}
queue<int> q;
for (int i = 1; i <= n; i++) {
if (degree[i] == 0) {
q.push(i);
need[i][i] = 1;
degree[i] = -1; // 기본 부품을 나타낸다.
}
}
while (!q.empty()) {
int top = q.front();
q.pop();
for (int i = 0; i < composition[top].size(); i++) {
int X = composition[top][i].first;
int Z = composition[top][i].second;
for (int j = 1; j <= n; j++) {
if (degree[j] == -1) {
need[X][j] += Z * need[top][j];
}
}
if (--degree[X] == 0) {
q.push(X);
}
}
}
for (int i = 1; i <= n; i++) {
if (degree[i] == -1) {
cout << i << " " << need[n][i] << endl;
}
}
return 0;
}
Comments
for (int j = 1; j <= n; j++) {
if (degree[j] == -1) {
need[X][j] += Z * need[top][j];
}
}
이 부분을 처음에
for (int j = 1; j <= n && degree[j] == -1; j++) {
need[X][j] += Z * need[top][j];
}
으로 작성하는 실수를 했다.
기본 부품 번호보다 작은 중간 부품이 있으면 for문이 조기종료 된다.😅
댓글