728x90
Nκ°μ λ Έλμ Mκ°μ μμ§κ° μλ κ·Έλνμμ, μΈ λ Έλ s, a, tκ° μ£Όμ΄μ‘μ λ sμμ aλ₯Ό λ°λμ μ§λμ tκΉμ§ λλ¬νλ κ°μ₯ 짧μ 거리λ₯Ό ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
μ λ ₯
νμ€ μ λ ₯μΌλ‘ μ λ ₯μ λ°λλ€. 첫 μ€μλ λ Έλμ κ°μ Nκ³Ό μμ§μ κ°μ Mμ΄ μ£Όμ΄μ§λ€. λ Έλμ κ°μλ 3 μ΄μ 100 μ΄νμ΄κ³ , μμ§μ κ°μλ 0κ° μ΄μ N(N-1)κ° μ΄νμ΄λ€.
λλ²μ§Έ μ€μλ μΈ μ μ s a tκ° μ£Όμ΄μ§λ€. λ Έλλ€μ 0 μ΄μ N λ―Έλ§μΈ μ μλ€λ‘ ννλλ©°, μ΄ μΈμ μλ κ°κ° μμ λ Έλ, μ€κ° λ Έλ, λμ°© λ Έλλ₯Ό λνλΈλ€.
μΈλ²μ§Έ μ€λΆν° μ΄ Mμ€μ μμ§ μ λ³΄κ° μ£Όμ΄μ§λ€. ν μ€μ μμ§ νλμ λν μ 보λ₯Ό λνλ΄λ©°, μΈ μ μ U V Wλ‘ μ΄λ£¨μ΄μ§λ€. Uλ μμ§μ μμ λ Έλ, Vλ μμ§μ λμ°© λ Έλ, Wλ μμ§μ κ°μ€μΉμ΄λ€. μ΄ κ·Έλνλ μ ν₯ κ·Έλνμ΄λ©° μμ§μ κ°μ€μΉλ -100 μ΄μ 100 μ΄νμΈ μ μμ΄λ€. U=V, μ¦ μμ μμ μμ μΌλ‘ μ΄μ΄μ§λ μμ§λ μμΌλ©°, μ΄ κ·Έλνμλ μμ κ°μ€μΉλ₯Ό κ°λ μ¬μ΄ν΄μ΄ μλ€.
μΆλ ₯
νμ€ μΆλ ₯μΌλ‘ μΆλ ₯νλ€. ν μ€λ‘ μΆλ ₯νκ³ , μ΄ μ€μλ sμμ aλ₯Ό κ±°μ³ bλ‘ κ°λ μ΅λ¨ 거리λ₯Ό μΆλ ₯νλ€.
μμ μ λ ₯
4 6
0 2 3
0 1 2
0 2 3
0 3 1
1 2 -1
1 3 4
2 3 2
μμ μΆλ ₯
3
bfs/dfs λ¬Έμ νλ²λ μ νμ΄λ΄€μ λ λμ¨ κ·Έλν κ³Όμ ...
μ΄λλ bfsκ° μ΄λ €μμ κ·Έλ₯ λ°λ³΅λ¬ΈμΌλ‘ μ΄μ¬ν νμλ€.
κ³Όκ±°μ λ©μ²ν λ,, κ·Έλλ λ§μ λ°μκ±° 보면 κ½€λ λλνμμ§λ
"μμ κ°μ€μΉλ₯Ό κ°λ 'μ¬μ΄ν΄'μ΄ μλ€"λΌκ³ νμΌλ―λ‘ Bellman Ford μκ³ λ¦¬μ¦μ μΌλκ±Έλ‘ κΈ°μ΅νλ€.
s->aμ μ΅λ¨κ±°λ¦¬λ₯Ό ꡬνκ³ , a->tμ μ΅λ¨κ±°λ¦¬λ₯Ό ꡬν΄μ λν΄μ£Όμλ€.
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
int dist[101];
struct Edge {
int s;
int e;
int val;
Edge(int u, int v, int w) {
s = u;
e = v;
val = w;
}
};
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, m; // λ
Έλ, μμ§
int s, a, t; // μμ, μ€κ°, λμ°©
int u, v, w; // μμ§ μμλ
Έλ, μμ§ λμ°©λ
Έλ, κ°μ€μΉ
cin >> n >> m >> s >> a >> t;
vector<Edge> ed;
for (int i = 0; i < m; ++i){
cin >> u >> v >> w;
ed.push_back(Edge(u, v, w));
}
for (int i = 0; i < n+1; i++) {
dist[i] = 100000;
}
dist[s] = 0;
for (int i = 0; i < n+1; i++) {
for (int j = 0; j < ed.size(); j++) {
int start = ed[j].s;
int end = ed[j].e;
int wei = ed[j].val;
int newWei = dist[start] + wei;
if (dist[start] != 100000 && newWei < dist[end]) {
dist[end] = newWei;
}
}
}
// cout << "s_to_a = "<< dist[a] << "\n";
int s_to_a = dist[a];
if(s_to_a == 100000) { // κ²½μ μ§μ κ° μ μμ λ μμΈμ²λ¦¬
exit(0);
}
//
for (int i = 0; i < n+1; i++) {
dist[i] = 100000;
}
dist[a] = 0;
for (int i = 0; i < n+1; i++) {
for (int j = 0; j < ed.size(); j++) {
int start = ed[j].s;
int end = ed[j].e;
int wei = ed[j].val;
int newWei = dist[start] + wei;
if (dist[start] != 100000 && newWei < dist[end]) {
dist[end] = newWei;
}
}
}
// cout << "a_to_t = " << dist[t]<<"\n";
int a_to_t = dist[t];
if (a_to_t == 100000)
{ // κ²½μ μ§μμ λμ°©μ μΌλ‘ κ° μ μμ λ μμΈμ²λ¦¬
exit(0);
}
cout << s_to_a + a_to_t;
return 0;
}
728x90
'π μ 곡 κ³΅λΆ > μκ³ λ¦¬μ¦ ν΄μ λ° μ€κ³' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μκ³ λ¦¬μ¦] μ€ν¨ ν¨μ - μ€λ³΅ μ΅λ λΆλΆλ¬Έμμ΄(cpp) (0) | 2023.04.11 |
---|---|
[μκ³ λ¦¬μ¦] λ¬Έμμ΄ λ€λ£¨κΈ° - λ‘λ§μ«μ(cpp) (0) | 2023.04.11 |
[μκ³ λ¦¬μ¦] DP - κ³λ¨ μ€λ₯΄κΈ°(cpp) (0) | 2023.04.11 |
[μκ³ λ¦¬μ¦] Greedy algorithm - μ΄μ§νΈ λλμ (cpp) (0) | 2023.02.09 |
[μκ³ λ¦¬μ¦] μ λ ¬μ μ΅μ μ± (0) | 2023.01.16 |