λμ΄λ : 골λ 3
κ±Έλ¦° μκ° : 45λΆ
λ¬Έμ
λ¬Έμ
Nκ°μ μ«μλ‘ κ΅¬λΆλ κ°κ°μ λ§μμ ν λͺ μ νμμ΄ μ΄κ³ μλ€.
μ΄λ λ μ΄ Nλͺ μ νμμ΄ X (1 ≤ X ≤ N)λ² λ§μμ λͺ¨μ¬μ νν°λ₯Ό λ²μ΄κΈ°λ‘ νλ€. μ΄ λ§μ μ¬μ΄μλ μ΄ Mκ°μ λ¨λ°©ν₯ λλ‘λ€μ΄ μκ³ iλ²μ§Έ κΈΈμ μ§λλλ° Ti(1 ≤ Ti ≤ 100)μ μκ°μ μλΉνλ€.
κ°κ°μ νμλ€μ νν°μ μ°ΈμνκΈ° μν΄ κ±Έμ΄κ°μ λ€μ κ·Έλ€μ λ§μλ‘ λμμμΌ νλ€. νμ§λ§ μ΄ νμλ€μ μλ κ²μλ¬μ μ΅λ¨ μκ°μ μ€κ³ κ°κΈ°λ₯Ό μνλ€.
μ΄ λλ‘λ€μ λ¨λ°©ν₯μ΄κΈ° λλ¬Έμ μλ§ κ·Έλ€μ΄ μ€κ³ κ°λ κΈΈμ΄ λ€λ₯Όμ§λ λͺ¨λ₯Έλ€. Nλͺ μ νμλ€ μ€ μ€κ³ κ°λλ° κ°μ₯ λ§μ μκ°μ μλΉνλ νμμ λꡬμΌμ§ ꡬνμ¬λΌ.
νμ΄
- λͺ¨λ μ μμ XκΉμ§μ μκ°κ³Ό Xμμ λͺ¨λ μ κΉμ§μ μκ°μ ꡬν΄μΌ νλ€.
- λ€μ΅μ€νΈλΌλ 1κ°μ μ μΌλ‘λΆν° λͺ¨λ μ κΉμ§μ μ΅λ¨ μκ°μ ꡬν΄μ£ΌκΈ° λλ¬Έμ, Nλ² μνν΄μΌ μνλ κ²°κ³Όλ₯Ό μ»μ μ μλ€.
- λ€μ΅μ€νΈλΌμ μκ°λ³΅μ‘λλ ElogE μ΄λ―λ‘ NMlogM μ μκ°λ³΅μ‘λκ° νμνκ³
- 10^7 μ λμ μκ°λ³΅μ‘λμ΄λ€.
- νλ‘μ΄λ μμ¬μ μ¨λ³΄μ.
- νλ‘μ΄λ μμ¬μ iλΆν° jκΉμ§μ κ²½λ‘λ₯Ό iλΆν° k, kλΆν° jκΉμ§μ κ²½λ‘μ λΉκ΅νμ¬ κ°±μ νλ λ°©λ²μ΄λ€.
- νλ‘μ΄λ μμ¬μ μκ°λ³΅μ‘λλ V^3 μ΄λ―λ‘ 10^9μ μκ°λ³΅μ‘λκ° νμνλ€.
- μκ°λ³΅μ‘λμ Vλ§ λ€μ΄κ°κΈ° λλ¬Έμ E(κ°μ μ μ)κ° ν΄ λ μ¬μ©νλ©΄ μ’λ€.
μ½λ
<λ€μ΅μ€νΈλΌ μ½λ>
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int main() {
// μ
λ ₯
int N, M, X;
cin >> N >> M >> X;
vector<pair<int, int>> path[10001]; // μΆλ° => (λμ°©, μκ°)
for (int i = 0; i < M; i++) {
int start, end, value;
cin >> start >> end >> value;
path[start].push_back(make_pair(end, value));
}
// μ΄κΈ°ν
int memo[1001][1001];
fill(&memo[0][0], &memo[1000][1000], 1e9);
for (int i = 1; i <= N; i++) {
// i : μμμ
priority_queue<pair<int, int>> que;
que.push(make_pair(0, i)); // μκ°, λ
Έλ
memo[i][i] = 0;
while (!que.empty()) {
pair<int,int> tmp = que.top();
int time = -tmp.first; int start = tmp.second;
que.pop();
if (memo[i][start] < time)
continue;
vector<pair<int, int>> canGo = path[start];
for (int j = 0; j < canGo.size(); j++) {
int time2 = canGo[j].second; int end = canGo[j].first;
if (memo[i][end] > memo[i][start] + time2) {
memo[i][end] = memo[i][start] + time2;
que.push(make_pair(-memo[i][end], end));
}
}
}
}
// νμλ€μ μμμκ° μΈ‘μ
int res = -1;
for (int i = 1; i <= N; i++) {
int value = memo[i][X] + memo[X][i];
if (value > res)
res = value;
}
cout << res << '\n';
}
<νλ‘μ΄λ μμ¬ μ½λ>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
// 9μ μμ 43λΆ λ
// λ°©ν₯μ΄ μλ κ·Έλν
// μ€κ³ κ°κΈ° (start => X => start)
// λ€μ΅μ€νΈλΌ nλ² or νλ‘μ΄λ μμ¬
// κ°μ₯ μ€λ걸리λ νμ
// μ΄κΈ°ν
// memset(memo, 1e9, sizeof(memo));
int memo[1001][1001];
fill(&memo[0][0], &memo[1000][1000], 1e9);
// μ
λ ₯
int N, M, X;
cin >> N >> M >> X;
for (int i = 0; i < M; i++) {
int start, end, value;
cin >> start >> end >> value;
memo[start][end] = value;
}
for (int i = 1; i <= N; i++) {
memo[i][i] = 0; // λκ°μ μ 0
}
// μλμ μμ μ§μΌμΌ μ λλ‘ μλ
for (int k = 1; k <= N; k++) { // κ±°μ³κ°λ λ
Έλ
for (int i = 1; i <= N; i++) { // μΆλ°
for (int j = 1; j <= N; j++) { // λμ°©
// i,j μ i,k + k,j λΉκ΅
memo[i][j] = min(memo[i][j], memo[i][k] + memo[k][j]);
}
}
}
// νμλ€μ μμμκ° μΈ‘μ
int res = -1;
for (int i = 1; i <= N; i++) {
int value = memo[i][X] + memo[X][i];
if (value > res)
res = value;
}
cout << res << '\n';
}
<ν μ€νΈμΌμ΄μ€>
5 8 1
1 4 1
4 5 5
1 3 2
3 1 1
4 2 4
2 4 4
5 3 6
3 2 3
=> 21
μκ°ν΄λ³Ό κ²
- E(κ°μ μ μ)κ° λ§€μ° ν¬λ©΄ νλ‘μ΄λ μμ¬μ μ΄μ©νλ κ²μ΄ λ«λ€.
- λ€μ΅μ€νΈλΌ : EVlogE
- νλ‘μ΄λμμ¬ : V^3
κ²°κ³Ό
μκ° νλ‘μ΄λ μμ¬, μλκ° λ€μ΅μ€νΈλΌμ΄λ€.
'Algorithm λ¬Έμ > BOJ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[c++] BOJ 10026 :: μ λ‘μμ½ (0) | 2021.04.23 |
---|---|
[c++] BOJ 14502 :: μ°κ΅¬μ (0) | 2021.04.22 |
[c++] BOJ 1916 :: μ΅μλΉμ© ꡬνκΈ° (0) | 2021.04.12 |
[c++] BOJ 1915 :: κ°μ₯ ν° μ μ¬κ°ν (0) | 2021.04.12 |
[c++] BOJ 1947 :: μμ¬μμ΄ νλ€ (0) | 2021.04.06 |
Comment