Algorithm

kruskal algorithm [c++]

PON_Z 2021. 1. 8. 14:29

ㅇ 크루스칼 알고리즘은 가장 적은 비용으로 모든 노드를 연결 하는 알고리즘

  -> 최소 비용 신장트리를 만들기 위함 ex) 여러 개의 도시들을 연결 하고자 할 때 비용을 최소한으로 하기 위해 사용

 

- 거리(cost)가 짧은 순서대로 그래프에 포함 시키면 됨

- 모든 노드를 최소비용으로 연결만 시키면 되기에 모든 간선 정보를 오름차순으로 정렬 한 뒤에 비용이 적은 간선부터

그래프에 포함

- 최소 비용 신장트리에서는 사이클이 발생하면 안 됨

 

 

1. 정렬된 순서에 맞게 그래프에 포함

2. 포함시키기 전에 사이클 테이블 확인

3. 사이클을 형성하는 경우 간선을 그래프에 포함시키지 않음

 

★ 사이클이 발생하는지 여부는 Union-Find 알고리즘을 사용

 

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

// union-find
int findParent(int parent[], int x) {
if (parent[x] == x) return x; // 부모가 자신일 경우
return findParent(parent, parent[x]);
}

void unionParent(int parent[], int a, int b) {
a = findParent(parent, a);
b = findParent(parent, b);
if (a < b) parent[b] = a;   // a가 부모일 경우
else parent[a] = b;
}

 

class Edge {
public :
int node[2]; // 연결된 두 개 노드
int cost;

Edge(int a, int b, int cost) { // 생성자
this->node[0] = a;
this->node[1] = b;
this->cost = cost;
}

bool operator <(Edge& edge) { // 정렬기준
return this->cost < edge.cost;
}

};

 

 

int main() {

const int n = 7; // 정점의 개수
const int m = 11; // 간선의 개수

vector<Edge> v;
v.push_back(Edge(1, 7, 12));
v.push_back(Edge(1, 4, 28));
v.push_back(Edge(1, 2, 67));
v.push_back(Edge(1, 5, 17));
v.push_back(Edge(2, 4, 25));
v.push_back(Edge(2, 5, 62));
v.push_back(Edge(3, 5, 20));
v.push_back(Edge(3, 6, 37));
v.push_back(Edge(4, 7, 13));
v.push_back(Edge(5, 6, 45));
v.push_back(Edge(5, 7, 73));
// 간선 정보

sort(v.begin(), v.end()); // cost 오름차순 정렬(operator)

int parent[n+1];
for (int i = 1; i < n+1; i++) { // 각 정점의 위치 저장
parent[i] = i;
}

int sum = 0;
for (int i = 0; i < v.size(); i++) {
// 사이클이 발생하지 않는 경우 그래프에 포함
if (findParent(parent, v[i].node[0]) != findParent(parent, v[i].node[1])) {
sum += v[i].cost;
unionParent(parent, v[i].node[0], v[i].node[1]);
}
}

cout << sum;

/* 정렬 출력테스트 
for (auto iter = v.begin(); iter != v.end(); iter++) {
cout << iter->getCost() << " ";
}
*/
return 0;
}

728x90

'Algorithm' 카테고리의 다른 글

소수(Prime Number) 판별 [c++]  (0) 2021.01.13
Binary Tree & Traversal [c++]  (0) 2021.01.11
Union-Find [c++]  (0) 2020.05.07
DFS [c++]  (0) 2020.04.18
BFS [c++]  (0) 2020.04.18