탐욕적인 방법(greedy method) 을 이용하여 네트워크(가중치를 간선에 할당한 그래프)의 모든 정점을 최소 비용으로 연결하는 최적 해답을 구하는 것
kruskal 알고리즘을 이용하여 MST를 만드는 과정
#include <iostream>
#include <vector>
#include <algorithm>
#define NODE 7
#define EDGE 9
using namespace std;
// 부모 노드를 가져옴, find 연산
int getParent(int parent[], int node) {
if (parent[node] == node) {
return node;
}
return getParent(parent, parent[node]);
}
//두 부모의 노드를 합침, 트리의 높이가 큰 쪽에 합침
int unionParent(int parent[], int x, int y) {
x = getParent(parent, x);
y = getParent(parent, y);
if (x < y) {
parent[y] = x;
return x;
}
else {
parent[x] = y;
return y;
}
}
//같은 부모 노드를 갖는지 확인
int findParent(int parent[], int x, int y) {
x = getParent(parent, x);
y = getParent(parent, y);
if (x == y) {
return 1;
} // 같은 부모노드
else {
return 0;
} // 다른 부모노드
}
//간선들의 정보
class Edge {
public:
int node[2]; //양 끝 정점
int distance;
Edge(int x, int y, int distance) {
this->node[0] = x;
this->node[1] = y;
this->distance = distance;
}
bool operator <(Edge &edge) {
return this->distance < edge.distance;
}
};
int main(int argc, char *argv[]) {
vector<Edge> v;
v.push_back(Edge(0, 1, 28));
v.push_back(Edge(0, 5, 10));
v.push_back(Edge(1, 2, 16));
v.push_back(Edge(1, 6, 14));
v.push_back(Edge(2, 3, 12));
v.push_back(Edge(3, 4, 22));
v.push_back(Edge(3, 6, 18));
v.push_back(Edge(4, 5, 25));
v.push_back(Edge(4, 6, 24));
//거리를 오름차순으로 정렬
sort(v.begin(), v.end());
//초기화
int parent[NODE];
for (int i = 0; i < NODE; i++) {
parent[i] = i;
}
int sum = 0;
for (int i = 0; i < v.size(); i++) {
if(!findParent(parent, v[i].node[0], v[i].node[1])){
//사이클이 생기지 않는 경우(다른 부모를 갖는 경우)
sum += v[i].distance;
// 연결을 하고 나면, 같은 부모를 갖게 되므로
unionParent(parent, v[i].node[0], v[i].node[1]);
} //end if
}//end for
//결과 확인
cout << sum;
return 0;
}