https://www.acmicpc.net/problem/1197
1197번: 최소 스패닝 트리
첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이
www.acmicpc.net
크루스칼 알고리즘으로 구현하였다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int V, E;
int A, B, C;
int getParent(int parent[], int x) {
if (parent[x] == 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 findParent(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() {
cin >> V >> E;
vector<Edge> v;
int parent[10000];
for (int i = 0; i < E; i++) {
cin >> A >> B >> C;
v.push_back({ A,B,C });
}
sort(v.begin(), v.end());
for (int i = 0; i < V; i++) {
parent[i] = i;
}
int sum = 0;
for (int i = 0; i < v.size(); i++){
if (!findParent(parent, v[i].node[0]-1, v[i].node[1]-1)) {
sum += v[i].distance;
unionParent(parent, v[i].node[0]-1, v[i].node[1]-1);
}
}
cout << sum << endl;
}
'Algorithm > 그리디' 카테고리의 다른 글
[프로그래머스] 광고삽입 (C++) (2021 KAKAO BLIND RECRUITMENT) (1) | 2021.10.02 |
---|---|
[백준] 1647번 : 도시 분할 계획 (0) | 2021.09.24 |
[백준] 1920번 : 수 찾기 (C++) (0) | 2021.09.21 |
[백준] 8980번 : 택배 (C++) (0) | 2021.09.05 |
[백준] 1041번 : 주사위 (C++) (0) | 2021.08.22 |
댓글