주어진 가중치 그래프에서 사이클이 없이 모든 점들을 연결시킨 트리 중에서 간선들의 가중치 합이 최소인 트리
해당 간선을 길이에 따라 정렬
길이가 작은 간선부터 선택하여 추가
사이클이 나오는 경우 간선을 버림
다시 간선 선택 반복
사이클 발생!->버림
다시 간선 선택
최종 MST
find(i): 원소 i를 포함하는 집합을 탐색하고, 해당 집합에 해당하는 트리의 루트 노드를 반환
#include <iostream>
#include <vector>
#include <algorithm>
#define Max 1001
using namespace std;
int parents[Max];
class Edge {
public:
int node[2];
int distance;
Edge(int a, int b, int dis)
{
this->node[0] = a;
this->node[1] = b;
this->distance = dis;
}
bool operator<(Edge& edge)
{
return this->distance < edge.distance;
}
};
int findParent(int node)
{
if (parents[node] < 0) return node;
return parents[node] = findParent(parents[node]);
}
void unionParent(int a, int b)
{
a = findParent(a);
b = findParent(b);
if (parents[a] <= parents[b]) // a가 밑으로 들어감
{
parents[b] += parents[a];
parents[a] = b;
}
else
{
parents[a] += parents[b];
parents[b] = a;
}
}
bool isCycle(int a, int b)
{
a = findParent(a);
b = findParent(b);
if (a == b) return true;
else return false;
}
int main()
{
vector<Edge> v;
v.push_back(Edge(0, 1, 10));
v.push_back(Edge(0, 2, 5));
v.push_back(Edge(1, 2, 7));
v.push_back(Edge(1, 3, 4));
v.push_back(Edge(2, 3, 3));
v.push_back(Edge(2, 4, 2));
v.push_back(Edge(3, 4, 1));
//간선 가중치 기준 오름차순 정렬
sort(v.begin(), v.end());
//부모노드 초기화
memset(parents, -1, sizeof(parents));
int sum = 0; // 간선의 가중치 합
for (int i = 0; i < v.size(); ++i) {
//싸이클 여부 확인
if (!isCycle(v[i].node[0], v[i].node[1])) {
sum += v[i].distance;
unionParent(v[i].node[0], v[i].node[1]);
}
}
// 최소 신장 트리 가중치 합 출력
cout << sum;
return 0;
}