Notice
Recent Posts
Recent Comments
Link
할껀하고놀자
[알고리즘] 간단한 크루스칼 알고리즘 구현(C++) 본문
728x90
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int n = 7;
const int m = 11;
int getParent(int parent[], int x) {
if (x == parent[x]) return x;
return parent[x] = getParent(parent, parent[x]);
}
void unionParent(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if (a < b)parent[b] = a;
else parent[a] = b;
}
int find(int parent[], int a, int b) {
a = getParent(parent, a);
b = getParent(parent, b);
if (a == b) {
return 1;
}
else {
return 0;
}
}
class Edge {
public:
int node[2];
int distance;
Edge(int a, int b, int distance) {
this->node[0] = a;
this->node[1] = b;
this->distance = distance;
}
bool operator<(Edge &edge) {
return this->distance < edge.distance;
}
};
int main() {
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, 24));
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());
// 그래프 최초 설정 먼저 해준다.
int set[n];
for (int i = 0; i < n; i++)
{
set[i] = i;
}
int sum = 0;
for (int i = 0; i < v.size(); i++)
{
// 사이클이 발생하지 않을 떄만 합쳐준다.
if (!find(set, v[i].node[0] - 1, v[i].node[1] - 1)) {
sum += v[i].distance;
unionParent(set, v[i].node[0] - 1, v[i].node[1] - 1);
}
}
cout << sum << endl;
return 0;
}
'[IT] > 알고리즘' 카테고리의 다른 글
[알고리즘] C++ split() 하는 초간단한 방법 (0) | 2019.06.07 |
---|---|
[알고리즘] 그리디 알고리즘 기초(C++) (0) | 2019.05.31 |
[알고리즘] 간단한 union-find 알고리즘의 구현(C++) (0) | 2019.05.31 |
[알고리즘] 간단한 dfs 구현 (C++) (0) | 2019.05.31 |
[알고리즘] 간단한 bfs 구현 (C++) (0) | 2019.05.31 |
Comments