๐ฉ ์ต์ ์ ์ฅ ํธ๋ฆฌ
์ ์ฅ ํธ๋ฆฌ ์ค ์ต์ ๋น์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
๐ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ : ๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ๋ ธ๋ ์ฐ๊ฒฐ ๊ฐ๋ฅ
๐ ์ ์ฅ ํธ๋ฆฌ
ํ๋์ ๊ทธ๋ํ๊ฐ ์์ ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ
๐ ์ต์ ์ ์ฅ ํธ๋ฆฌ
์ ์ฅ ํธ๋ฆฌ ์ค์์๋ ์ต์ํ์ ๋น์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์ ์ฅ ํธ๋ฆฌ
์ผ์ชฝ ๊ทธ๋ํ์์ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์ผ๋ฉด 25๋ฅผ ์ ์ธํ 2๊ฐ์ ๊ฐ์ (23+13)์ผ๋ก ์ด๋ฃจ์ด์ง ์ ์ฅํธ๋ฆฌ
์ฆ, ์ ์ฅ ํธ๋ฆฌ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ์ต์ ๋น์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ์ ์ฅ ํธ๋ฆฌ
๐ฉ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ๋์๊ณผ์
1. ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋น์ฉ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
2. ๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉด์ ํ์ฌ์ ๊ฐ์ ์ด ์ฌ์ดํด์ ๋ฐ์์ํค๋์ง ํ์ธ
๐ ์ฌ์ดํด ๋ฐ์ ์ฌ๋ถ์ ๋ฐ๋ผ, ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ํฌํจ ์ฌ๋ถ ๊ฒฐ์
3. ๋ชจ๋ ๊ฐ์ ์ ๋ํด 2๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
1. ๊ทธ๋ํ์ ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ง ๋นผ๋ด์ด ์ ๋ ฌ์ ์ํํ๋ค. (์๋๋ ๋น์ฉ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค)
2. ๋น์ฉ์ด ๊ฐ์ฅ ์ต์์ธ (3,4)๋ฅผ ์ ํํ ํ 3๋ฒ ๋ ธ๋์ 4๋ฒ ๋ ธ๋์ ๋ํ์ฌ union ํจ์๋ฅผ ์ํํ๋ค.
3. ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ ๋ค ์ค ๊ฐ์ฅ ์ต์์ธ (4,7)์ ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ค.
4. ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ ๋ค ์ค ๊ฐ์ฅ ์ต์์ธ (4,6)์ ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ค.
5. ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ ๋ค ์ค์์ ๊ฐ์ฅ ์ต์์ธ (6,7)์ ์ ํํ์ฌ ์ฒ๋ฆฌํ๋ค. ํ์ง๋ง, (6,7)์ ์ ํํ ๊ฒฝ์ฐ ์ฌ์ดํด์ด ๋ฐ์ํ๋ฏ๋ก (6,7) ๊ฐ์ ์ ์ฐ๊ฒฐํ์ง ์๋๋ค.
6. ์์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ์ ์ฐ๊ฒฐํด์ค ์ต์ข ๊ฒฐ๊ณผ
๊ฐ์ ์ ๋น์ฉ์ ๋ชจ๋ ๋ํ๋ฉด ์ต์ข ๋น์ฉ์ ํด๋นํ๋ค. ์ด ๋น์ฉ์ 159์ด๋ค.
๐ฉ ์๊ฐ๋ณต์ก๋
๊ฐ์ ์ ๊ฐ์๊ฐ E๊ฐ์ผ ๋, O(ElogE)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// ๊ทธ๋ํ์ ๊ฐ์ ์ ๋ํ๋ด๋ ๊ตฌ์กฐ์ฒด
struct Edge {
int src, dest, weight;
};
// ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ฐพ๋ ํจ์ (Union-Find ์๊ณ ๋ฆฌ์ฆ)
int findParent(int parent[], int i) {
if (parent[i] == -1)
return i;
return findParent(parent, parent[i]);
}
// ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ๋น๊ต ํจ์
bool compare(Edge a, Edge b) {
return a.weight < b.weight;
}
// ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
void kruskalMST(vector<Edge>& edges, int V) {
// ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ฒกํฐ
vector<Edge> result;
// ๊ฐ ์ ์ ์ ๋ถ๋ชจ ๋
ธ๋๋ฅผ ์ ์ฅํ ๋ฐฐ์ด
int parent[V];
fill(parent, parent + V, -1);
// ๊ฐ์ ์ ๊ฐ์ค์น๋ก ์ ๋ ฌ
sort(edges.begin(), edges.end(), compare);
int edgeCount = 0; // ๊ฒฐ๊ณผ์ ํฌํจ๋ ๊ฐ์ ์ ์
int index = 0; // ํ์ฌ ๊ณ ๋ ค ์ค์ธ ๊ฐ์ ์ ์ธ๋ฑ์ค
while (edgeCount < V - 1 && index < edges.size()) {
Edge nextEdge = edges[index++];
int srcParent = findParent(parent, nextEdge.src);
int destParent = findParent(parent, nextEdge.dest);
// ์ฌ์ดํด์ ํ์ฑํ์ง ์์ผ๋ฉด ํด๋น ๊ฐ์ ์ ๊ฒฐ๊ณผ์ ์ถ๊ฐ
if (srcParent != destParent) {
result.push_back(nextEdge);
edgeCount++;
// Union ์ฐ์ฐ ์ํ
parent[srcParent] = destParent;
}
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
cout << "Edges in MST:\n";
for (Edge edge : result) {
cout << edge.src << " - " << edge.dest << " : " << edge.weight << endl;
}
}
int main() {
// ๊ทธ๋ํ์ ์ ์ ์์ ๊ฐ์ ์
int V, E;
cout << "Enter the number of vertices and edges: ";
cin >> V >> E;
// ๊ทธ๋ํ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฒกํฐ
vector<Edge> edges;
// ๊ฐ์ ์ ๋ณด ์
๋ ฅ ๋ฐ๊ธฐ
for (int i = 0; i < E; ++i) {
Edge edge;
cout << "Enter source, destination and weight of edge " << i + 1 << ": ";
cin >> edge.src >> edge.dest >> edge.weight;
edges.push_back(edge);
}
// ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ ํธ์ถ
kruskalMST(edges, V);
return 0;
}
'๐ฉโ๐ป ํ๋ก๊ทธ๋๋ฐ > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(์ต๋จ ๊ฒฝ๋ก) (1) | 2024.04.19 |
---|---|
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ (์ต์ ์ ์ฅ ํธ๋ฆฌ) (0) | 2024.04.19 |
B-ํธ๋ฆฌ (0) | 2024.04.16 |
๋ ๋-๋ธ๋ ํธ๋ฆฌ(Red-Black Tree) (0) | 2024.04.15 |
2-3-4 ํธ๋ฆฌ (0) | 2024.04.14 |