2023. 12. 21. 16:48γCoding Test/BOJ
πλ¬Έμ 보λ¬κ°κΈ°
π¨π»νμ΄ κ³Όμ
μμ μ λ ¬κ³Ό λ€μ΄λλ―Ή νλ‘κ·Έλλ°μ ν΅ν΄ νμμ΅λλ€. μ²μμλ DFSλ‘ ν μ μμ κ² κ°λ¨ μκ°μ λμ νλ €κ³ νλλ°, μ€λ³΅λλ κ³μ°μ΄ λ무 λ§μ μκ° μ΄κ³Όκ° λ κ² κ°λ¨ μκ°μ΄ λ€μ΄ κ·Έ νμ΄λ ν¬κΈ°νμ΅λλ€. μ무νΌ, μ κ° μ΄λ»κ² νμλμ§ μ²μ²ν μ€λͺ ν΄ λ리λλ‘ νκ² μ΅λλ€.
1. κ°μ μ 보 λ° μ§μ μ°¨μ μ€μ
νμ λΆνμμ μμ λΆνμΌλ‘ κ°μ μ΄ κ°λ¦¬ν€λλ‘ λ°©ν₯μ μ€μ νμκ³ , νμν λΆν κ°μ μ 보λ κ°μ΄ κ΄λ¦¬νμμ΅λλ€.
#include <vector>
using namespace std;
using Part = pair<int, int>; // <λΆν λ²νΈ, νμν κ°μ>
int main() {
int N, M;
cin >> N >> M;
// κ°μ μ 보 λ° μ§μ
μ°¨μ μ 보 λ±λ‘
vector<vector<Part>> parts(N + 1, vector<Part>());
vector<int> inDegrees(N + 1);
int upperPart, lowerPart, count;
for (int i = 0; i < M; i++) {
cin >> upperPart >> lowerPart >> count;
parts[lowerPart].emplace_back(upperPart, count);
inDegrees[upperPart]++;
}
//...
}
λ¬Έμ μ λμμλ μμ λ₯Ό ν΅ν΄ κ·Έλνλ₯Ό ꡬμ±νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
2) 2μ°¨μ DP λ°°μ΄μ ν΅ν κΈ°λ³Έ λΆν κ°μ κΈ°μ΅
2μ°¨μ λ°°μ΄ DPλ₯Ό μ μΈν©λλ€. DP[i][j]μ λ»μ iλ² λΆνμ 1κ° λ§λλλ° νμν jλ² λΆνμ μ 체 κ°μλΌλ λ»μ΄μ£ .
μλ₯Ό λ€μ΄, 6λ² λΆνμ λ§λλ λ° νμν 1λ² λΆνμ μ΄ κ°μ DP[6][1] = 4 κ° λ κ²λλ€. μ΄μ κ°μ λ°©μμΌλ‘ μ μ₯ν΄ μ€ κ²λλ€.
κ·Έλ¬κΈ° μν΄, 1λ² λΆνλΆν° Nλ² λΆνκΉμ§ μννλ©° μ§μ μ°¨μκ° 0μΈ λΆν iλ₯Ό μ°Ύμ΅λλ€.
μ§μ μ°¨μκ° 0μ΄λΌλ κ²μ κΈ°λ³Έ λΆνμ΄λΌλ κ²μ μλ―ΈνκΈ° λλ¬Έμ΄μ£ .
λΆν iλ₯Ό μ°Ύμλ€λ©΄, μμ μ λ ¬μ μν ν(Queue)μ μ§μ΄ λ£μκ³Ό λμμ, DP[i][i] = 1λ‘ μ΄κΈ°ν ν΄μ£Όλλ‘ ν©λλ€.
*(κΈ°λ³Έ λΆνμΈ μκΈ° μμ μ λ§λλ λ° νμν κ°μλ 1μ΄κΈ° λλ¬Έμ΄μ£ .)
vector<vector<int>> dp(N + 1, vector<int>(N + 1));
queue<int> nextParts;
for (int i = 1; i <= N; i++) {
if (inDegrees[i] == 0) {
dp[i][i] = 1;
nextParts.push(i);
}
}
μμμ λ΄€λ μμ λ₯Ό ν λλ‘ μ΄ κ³Όμ μ μ§νν΄μ€λ€λ©΄, λ€μκ³Ό κ°μ 2μ°¨μ λ°°μ΄μ΄ λ κ²λλ€.
μ΄μ μμ μ λ ¬ μκ³ λ¦¬μ¦μ μ μ©ν΄ μ€μλ€.
for (int i = 1; i <= N; i++) {
int lowerPart = nextParts.front();
nextParts.pop();
for (const auto& upperLevel : parts[lowerPart]) {
int upperPart = upperLevel.first;
int upperPartCount = upperLevel.second;
// -------μ€μ-------
for (int i = 1; i <= N; i++)
dp[upperPart][i] += dp[lowerPart][i] * upperPartCount;
// -------μ€μ-------
if (--inDegrees[upperPart] == 0)
nextParts.push(upperPart);
}
}
DP[i] νμλ iλ² λΆν 1κ°λ₯Ό λ§λ€κΈ° μν΄ νμν, λͺ¨λ λΆν μ¬λ£ κ°μκ° λ€μ΄μμ΅λλ€.
μμ μμ 5λ² λΆνμ λ§λ€κΈ° μν΄μ , 1λ² λΆν 2κ°μ 2λ² λΆν 2κ°κ° νμνλ€κ³ λμ μμ΅λλ€.
κ·Έλ λ€λ©΄ 1λ² λΆνμ λ§λλ λ° νμν i λ²μ§Έ λΆν * 2 ν κ°μ 5λ² λΆνμ λ§λλ λ° νμν i λ²μ§Έ λΆν κ°μμ λν΄μ€μΌκ² μ£ . λ§μ°¬κ°μ§λ‘ 2λ² λΆνμ λ§λλ λ° νμν i λ²μ§Έ λΆν * 2 ν κ°μ 5λ² λΆνμ λ§λλ λ° νμν i λ²μ§Έ λΆν κ°μμ λν΄μ£Όλ©΄ λ κ²λλ€.
μ΄κ±Έ μ½λ μμΌλ‘ λνλΈ κ² λ€μ μ½λμ λλ€.
for (int i = 1; i <= N; i++)
dp[upperPart][i] += dp[lowerPart][i] * upperPartCount;
μ΄ λΆλΆλ§ μΆκ°ν΄μ£Όκ³ , λλ¨Έμ§λ μμ μ λ ¬μ ν΄μ£Όλ©΄ λ©λλ€.
μμ μ λ ¬μ΄ λλ¬λ€λ©΄, dp[N]μ ν΄λΉνλ νμμ 0μ μ μΈν κ°λ€μ μ°¨λ‘λλ‘ μΆλ ₯ν΄μ£Όλ©΄ λ©λλ€.
* dp[N][5] = 0 μ΄λΌλ κ²μ 5λ² λΆνμ΄ κΈ°λ³Έ λΆνμ΄ μλλΌλ κ±Έ λ»νκΈ° λλ¬Έμ΄μ£ .
βοΈμμ€ μ½λ λ° κ²°κ³Ό
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
using Part = pair<int, int>; // <λΆν λ²νΈ, νμ κ°μ>
#define FAST_IO ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
vector<int> Solution(const vector<vector<Part>>& parts, vector<int>& inDegrees, int N) {
vector<vector<int>> dp(N + 1, vector<int>(N + 1));
queue<int> nextParts;
for (int i = 1; i <= N; i++) {
if (inDegrees[i] == 0) {
dp[i][i] = 1;
nextParts.push(i);
}
}
for (int i = 1; i <= N; i++) {
int lowerPart = nextParts.front();
nextParts.pop();
for (const auto& upperLevel : parts[lowerPart]) {
int upperPart = upperLevel.first;
int upperPartCount = upperLevel.second;
for (int i = 1; i <= N; i++)
dp[upperPart][i] += dp[lowerPart][i] * upperPartCount;
if (--inDegrees[upperPart] == 0)
nextParts.push(upperPart);
}
}
return dp[N];
}
int main() {
FAST_IO
int N, M;
cin >> N >> M;
vector<vector<Part>> parts(N + 1, vector<Part>());
vector<int> inDegrees(N + 1);
int upperPart, lowerPart, count;
for (int i = 0; i < M; i++) {
cin >> upperPart >> lowerPart >> count;
parts[lowerPart].emplace_back(upperPart, count);
inDegrees[upperPart]++;
}
vector<int> answers = Solution(parts, inDegrees, N);
for (int i = 1; i <= N; i++) {
if (answers[i] != 0)
cout << i << " " << answers[i] << "\n";
}
return 0;
}
'Coding Test > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ] 3055λ² | νμΆ (C++) (1) | 2024.01.31 |
---|---|
[BOJ] 2357λ² | μ΅μκ°κ³Ό μ΅λκ° (C++) (1) | 2024.01.24 |
[BOJ] 11779λ² | μ΅μλΉμ© ꡬνκΈ° 2 (C++) (1) | 2023.12.20 |
[BOJ] 2623λ² | μμ νλ‘κ·Έλ¨ (C++) (1) | 2023.12.19 |
[BOJ] 1516λ² | κ²μ κ°λ° (C++) (1) | 2023.12.19 |