๐ฉ์์ ๊ฐ์ค์น(์์ ๊ฐ์ , ์์ ๊ฐ)๊ฐ ์๋ ๊ทธ๋ํ์ ํ ๋ ธ๋์์ ๊ฐ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ ๊ผญ์ง์ ๊ฐ์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ด์ง๋ง
ํ ๊ผญ์ง์ ์ "์์ค" ๊ผญ์ง์ ์ผ๋ก ๊ณ ์ ํ๊ณ , ๊ทธ๋ํ์ ๋ค๋ฅธ ๋ชจ๋ ๊ผญ์ง์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต๋จ ๊ฒฝ๋ก ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์ผ๋ก๋ ์ฌ์ฉ
๐ฉ ๊ทธ๋ฆฌ๋์ด์ ๋์ ๊ณํ๋ฒ
๊ทธ๋ฆฌ๋ : ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํ
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ : ํด๋น ๋ ธ๋๋ก๋ถํฐ ๊ฐ ์ ์๋ ๋ ธ๋๋ค์ ๋น์ฉ์ ๊ฐฑ์
๐ ๊ฐ๋ฅํ ์ ์ ๋น์ฉ์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ํด๋ต์ ๋๋ฌํ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ด๋ ๋๋ถ๋ถ์ ๋ฌธ์ ์ ์์ฉ๋๋ค.
๐ฉ ์์
A๋ ธ๋์์ ์ถ๋ฐํ์ฌ F๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์
S = ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ ์งํฉ
d[N] = A -> N๊น์ง ๊ณ์ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ
Q = ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค์ ์งํฉ
ํ์ธ๋์ง ์์ ๊ฑฐ๋ฆฌ๋ ์ ๋ถ ์ด๊ธฐ๊ฐ์ ๋ฌดํ์ผ๋ก ์ก๋๋ค ์)INF
์ถ๋ฐ์ง์ ์ถ๋ฐ์ง์ ๊ฑฐ๋ฆฌ๋ ํ์ธํด ๋ณผ ํ์๋ ์์ด 0 ๐ d[A] = 0
์ถ๋ฐ์ง๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๋ค๋ ์์ง ํ์ธ๋์ง ์์๊ธฐ์ ๐ d[๋ค๋ฅธ ๋ ธ๋] = ๋ฌดํ
Q๋ ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋๋ค์ ์งํฉ์ด๋ฏ๋ก, ์ด๊ธฐํํ ๋๋ ๋ชจ๋ ๋ ธ๋๋ค์ ์งํฉ์ด ๋๋ค.
S๋ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ง ์์ผ๋ฏ๋ก ๊ณต์งํฉ ์ํ
1. ๋ฃจํ๋ฅผ ๋๋ ค ์ด์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๋ค.
2. ์ฒซ ๋ฃจํ ์ดํ์ ๊ทธ๋ํ์ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋๋ ๋ฐฉ์
3. ๋ ๋น ๋ฅธ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฒฌํ ๊ฒฝ์ฐ, d[C] = 5 -> 4 ๊ฐ ์ ๋ฐ์ดํธ
4. ๋ฌดํ๋ฐ๋ณต ๋ฐ ๊ฒฐ๊ณผ
๋ชฉ์ ์ง๊ฐ F์์ผ๋ฏ๋ก, ๊ฑฐ๋ฆฌ๋ 8
๐ฉ ๊ตฌํ ๋ฐฉ๋ฒ
1. ์ธ์ ํ๋ ฌ, ์ ํํ์(๋ฐ๋ณต๋ฌธ ์ด์ฉ), O(V^2)
ํ ๋ฒ ๋ฐฉ๋ฌธํ ๋ฐฐ์ด์ ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ๋ฐฐ์ด์ด ํ์ํ ๊ฒ์ด๊ณ , ๊ฐ ๋ ธ๋๊น์ง์ ์ต์ ๋น์ฉ์ ์ ์ฅํ ๋ฐฐ์ด์ด ํ์ํ ๊ฒ
๊ตฌํ์์ ๊ณ ๋ คํ ๊ฒ์ ๋ฏธ๋ฐฉ๋ฌธ ์ง์ ์ ๊ฐ์ ํญ์ ์ต์์ ๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ ๊ฒ์ด ๋ชฉํ์ด๊ธฐ ๋๋ฌธ์, ๋ฏธ๋ฐฉ๋ฌธ์ง์ ์ ๋งค์ฐ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํํ์ฌ ์ฒ๋ฆฌํด์ฃผ๋ฉด ๋๋ค.
์ต์ ๋น์ฉ์ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ ํํ๋ ๊ณผ์ ์ ์ต์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ธํด์ผ ํ๊ณ , ์ด๊ฒ์ V๋ฒ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์, O(V^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
#include <iostream>
#include <vector>
#include <limits>
using namespace std;
const int INF = numeric_limits<int>::max(); // ๋ฌดํ๋๋ฅผ ํํํ๊ธฐ ์ํ ์์
// ์ต์๊ฐ ๋ฐํ ํจ์
int minDistance(const vector<int>& dist, const vector<bool>& visited) {
int minDist = INF, minIndex = -1;
int n = dist.size();
for (int i = 0; i < n; ++i) {
if (!visited[i] && dist[i] <= minDist) {
minDist = dist[i];
minIndex = i;
}
}
return minIndex;
}
// ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ํจ์
vector<int> dijkstra(const vector<vector<int>>& graph, int start) {
int n = graph.size();
vector<int> dist(n, INF); // ์์์ ์ผ๋ก๋ถํฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
vector<bool> visited(n, false); // ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
dist[start] = 0; // ์์์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ 0
// ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ฐ๋ณต
for (int count = 0; count < n - 1; ++count) {
int u = minDistance(dist, visited); // ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์ ์ ์ ํ
visited[u] = true; // ํด๋น ์ ์ ์ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
// ์ ํ๋ ์ ์ ์ ํตํด ๊ฐ ์ ์๋ ๋ชจ๋ ์ธ์ ์ ์ ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐฑ์
for (int v = 0; v < n; ++v) {
if (!visited[v] && graph[u][v] != INF && dist[u] != INF && dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
return dist;
}
int main() {
int n, m; // ๋
ธ๋ ์, ๊ฐ์ ์
cin >> n >> m;
vector<vector<int>> graph(n, vector<int>(n, INF)); // ์ธ์ ํ๋ ฌ๋ก ๊ทธ๋ํ ํํ
// ๊ฐ์ ์ ๋ณด ์
๋ ฅ
for (int i = 0; i < m; ++i) {
int u, v, w; // ์ถ๋ฐ์ , ๋์ฐฉ์ , ๊ฐ์ค์น
cin >> u >> v >> w;
graph[u][v] = w; // u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ ๊ฐ์ ์ถ๊ฐ
}
int start; // ์์์
cin >> start;
vector<int> shortest_distances = dijkstra(graph, start); // ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ํธ์ถ
// ์์์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
for (int i = 0; i < n; ++i) {
if (shortest_distances[i] == INF) {
cout << "INF ";
} else {
cout << shortest_distances[i] << " ";
}
}
cout << endl;
return 0;
}
2. ์ธ์ ๋ฆฌ์คํธ์ ํ, ์ฐ์ ์์ ํ ์ด์ฉ, O((V+E)logV)
#include <iostream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;
// ๊ฐ์ ์ ํํํ๋ ํด๋์ค
class Edge {
public:
int to;
int weight;
Edge(int t, int w) : to(t), weight(w) {}
};
// ์ฐ์ ์์ ํ์์ ์ฌ์ฉํ ๋น๊ต ํจ์ ์ ์
class Compare {
public:
bool operator() (const pair<int, int>& a, const pair<int, int>& b) {
return a.second > b.second;
}
};
// ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
vector<int> dijkstra(vector<vector<Edge>>& graph, int start) {
int n = graph.size();
vector<int> dist(n, numeric_limits<int>::max()); // ์์์ ์์์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
dist[start] = 0; // ์์์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ 0
priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> pq; // ์ฐ์ ์์ ํ
pq.push({start, 0}); // ์์์ ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ํ์ ์ฝ์
while (!pq.empty()) {
int u = pq.top().first;
int d = pq.top().second;
pq.pop();
if (d > dist[u]) continue; // ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ ์ ์ ์คํต
for (const Edge& e : graph[u]) {
int v = e.to;
int w = e.weight;
// Relaxation
if (dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push({v, dist[v]});
}
}
}
return dist;
}
int main() {
int n, m; // ๋
ธ๋ ์, ๊ฐ์ ์
cin >> n >> m;
vector<vector<Edge>> graph(n); // ์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ํํ
// ๊ฐ์ ์ ๋ณด ์
๋ ฅ
for (int i = 0; i < m; ++i) {
int u, v, w; // ์ถ๋ฐ์ , ๋์ฐฉ์ , ๊ฐ์ค์น
cin >> u >> v >> w;
graph[u].push_back(Edge(v, w)); // u์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น w์ ๊ฐ์ ์ถ๊ฐ
}
int start; // ์์์
cin >> start;
vector<int> shortest_distances = dijkstra(graph, start); // ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ํธ์ถ
// ์์์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ถ๋ ฅ
for (int i = 0; i < n; ++i) {
if (shortest_distances[i] == numeric_limits<int>::max()) {
cout << "INF ";
} else {
cout << shortest_distances[i] << " ";
}
}
cout << endl;
return 0;
}
๐ฉ ์ฅ์
์ธ์ ํ๋ ฌ ๋๋ ์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์ ์์ด ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ ๋ฌด์ฐจ๋ณ ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ํจ์จ์
๊ฑฐ๋ฆฌ๋ฟ ์๋๋ผ ๊ฒฝ๋ก๋ฅผ ์ถ์ ํ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๊ฒ ์์ ํ ์ ์๋ค.
๐ฉ ๋จ์
์ฐ์ ์์ ๋๊ธฐ์ด์ ์ฌ์ฉํ ๋ ๊ฐ์ ์ด ๋ง์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ๋๋ ค์ง ์ ์๋ค.
๊ทธ๋ํ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ค๋ฉด ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ๋ค.
๋์ผํ ๊ฑฐ๋ฆฌ์ ์ฌ๋ฌ ๊ฒฝ๋ก๊ฐ ์๋ ๊ฒฝ์ฐ ์ต์์ ๊ฒฝ๋ก๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
์งํ์ด๋ ๊ตํต ์ํฉ๊ณผ ๊ฐ์ ๋ค๋ฅธ ์์๋ ๊ณ ๋ คํ์ง ์๋๋ค.
'๐ฉโ๐ป ํ๋ก๊ทธ๋๋ฐ > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (0) | 2024.04.19 |
---|---|
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (0) | 2024.04.19 |
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ) (0) | 2024.04.19 |
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ) (1) | 2024.04.19 |
B-ํธ๋ฆฌ (0) | 2024.04.16 |