-
1197번 최소 스패닝 트리 | Kruskal Algorithm 쿠르스칼 알고리즘 | Baekjoon BOJ 백준 9372 C++ 코드, 해설, 풀이[백준 알고리즘]/[C++] 2021. 1. 13. 13:18728x90반응형
이번 포스팅은 백준 1197번 최소 스패닝 트리입니다.
아래 url를 클릭하시면 백준 사이트에서 문제를 볼 수 있습니다.
기본 알고리즘
MST 최소 신장 트리
Kruskal Algorithm 사용
참고 설명
line 16
parent[i]가 -1이면 정점 i는 정점 집합의 루트가 됨. 아니면 이 정점은 다른 정점이 루트가 되는 집합에 속한 원소임.
line 43
const로 정의해야 하는 이유
2021/01/13 - [[TROUBLESHOOTING]] - C++ 개체에 멤버 함수과(와) 호환되지 않는 형식 한정자가 있습니다.
line 48-50, 81
vector를 클래스의 변수 기준으로 정렬
2021/01/13 - [[C , C++]] - C++ vector sort() 벡터 클래스 변수 기준 정렬전체 코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384//백준1197 최소스패닝트리#include <iostream>#include <vector>#include <algorithm>using namespace std;#define MAX_VTXS 10000class VertexSets { //정점 집합 클래스int parent[MAX_VTXS]; //부모 정점의 idint nSets; //집합의 개수public:VertexSets(int n) :nSets(n) {for (int i = 0; i < nSets; i++)parent[i] = -1; //모든 정점이 고유의 집합에 속함}bool isRoot(int i) {return parent[i] < 0;}int findSet(int v) { //전체 집합들 중에서 정점 v를 포함하는 집합의 루트를 찾아서 반환while (!isRoot(v)) { //v가 어떤 집합의 루트가 아니면 계속 루트를 찾아감v = parent[v];}return v;}void unionSets(int s1, int s2) { //두 집합 s1, s2 합하는 함수parent[s1] = s2; //parent[s1]이 s2를 가리키도록 함. s1은 더 이상 루트가 아님.nSets--;}};class Edge {int v1;int v2;int w;public:Edge(int ver1, int ver2, int weight): v1(ver1), v2(ver2), w(weight) {}int getWeight() const { return w; }int getV1() { return v1; }int getV2() { return v2; }};bool compareWeight(const Edge& n1, const Edge& n2) {return n1.getWeight() < n2.getWeight();}int V, E;vector<Edge> eVec; //간선 저장 벡터void Kruskal() {int sum = 0;VertexSets set(V); //정점 개수만큼 초기 집합 생성for (int i = 0; i < E; i++) {int uSet = set.findSet(eVec[i].getV1());int vSet = set.findSet(eVec[i].getV2());if (uSet != vSet) {sum += eVec[i].getWeight(); //가중치 합set.unionSets(uSet, vSet);}}cout << sum << endl;}int main() {cin >> V >> E;int A, B, C;for (int i = 0; i < E; i++) {cin >> A >> B >> C;eVec.push_back(Edge(A, B, C));}sort(eVec.begin(), eVec.end(), compareWeight);Kruskal();}cs 728x90반응형'[백준 알고리즘] > [C++]' 카테고리의 다른 글
4344번 평균은 넘겠지 | Baekjoon BOJ 백준 4344 C++ 코드, 해설, 풀이 (1) 2021.01.15 3460번 이진수 | Baekjoon BOJ 백준 3460 C++ 코드, 해설, 풀이 (0) 2021.01.15 9372번 상근이의 여행 | Baekjoon BOJ 백준 9372 C++ 코드, 해설, 풀이 (0) 2021.01.12 5052번 전화번호 목록 | Baekjoon BOJ 백준 5052 C++ 코드, 해설, 풀이 (0) 2021.01.11 11866번 요세푸스 문제 0 / Baekjoon BOJ 백준 11866 C++ 코드, 해설, 풀이 (0) 2020.12.22