[ 백준 1197 ] 최소 스패닝 트리 (C++) - 최소 스패닝 트리

2024. 9. 6. 12:37· 문제풀이/알고리즘 문제 풀이
목차
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
728x90

🔗 문제 링크

https://www.acmicpc.net/problem/1197


💡 문제 풀이 및 해석

  1. 문제에서 최소 스패닝 트리라고 나와 있으므로 같은 방식으로 풀면 좋다.
  2. 사실 최소 스패닝 트리가 기억이 잘 나지 않지만, 일단 트리 형식을 갖추면서 가중치가 가장 적은 트리를 만들어야 한다는 것을 알 수 있다.
  3. 그러면 최대한 낮은 비용의 간선부터 연결해야 한다.
  4. 단, 간선을 연결할 때, Cycle이 생기면 안된다. => Root가 같은 것들끼리는 연결해서는 안된다.
  5. 따라서 비용을 오름차순으로 정렬하고 4번을 지키면서 낮은 것들을 계속 연결해가면 된다.
  6. 단, 매번 부모를 계속 찾을 수 없으므로 매번 현재 나의 Root가 무엇인지 업데이트 해준다.

⭐️ 정답 코드 및 설명

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

using namespace std;

int V, E;

vector<pair<int, pair<int, int>>> edges; // cost, V1, V2
int root[10001];

void input() {
    cin >> V >> E;

    // 일단, 처음엔 모두 자기 자신이 Root다.
    for (int i = 1; i <= V; i++) { 
        root[i] = i;
    }

    for (int i = 0; i < E; i++) {
        int A, B, C;
        cin >> A >> B >> C;
        edges.push_back({C, {A, B}});
    }

    // 비용 기준으로 오름차순
    sort(edges.begin(), edges.end());
}

// 부모를 찾는 메서드
int getRoot(int x) {
    if (root[x] == x) return x;
    return root[x] = getRoot(root[x]); // 매번 업데이트
}

long long sol() {
    int cost, A, B;
    long sum = 0;
    for (auto edge : edges) {
        cost = edge.first;
        A = edge.second.first;
        B = edge.second.second;
        if (getRoot(A) != getRoot(B)) { // 부모가 다르다면
            sum += cost;
            root[getRoot(B)] = getRoot(A); // 부모를 업데이트해준다.
        }
    }
    return sum;
}

int main() {
    input();
    cout << sol();
    return 0;
}

🤔 문제 후기

root[getRoot(B)] = getRoot(A); 이 부분에서 root[B] = getRoot(A);로 풀어서 너무 오래 걸렸다. 다른 부분은 10~20분 만에 작성하였는데, 해당 부분을 고치는데 1시간이 걸린 것 같다. 처음에는 당연히 B가 A의 루트로 업데이트 되니 문제 없을 것이라고 생각했지만, https://www.acmicpc.net/board/view/139913 이곳의 반례를 보고 B의 루트를 바꿔줘야 하는 것을 알았다. 그래야 나중에 1->2->6->4->8 이런식으로 나왔을 때, 3->7->8 으로 연결하고 1->3 으로 연결할 때, 문제가 생기지 않는다.(루트는 1이다.) 설명을 잘 못한 것 같은데, 해당 반례를 보고 node의 좌표를 찍어보면 이해하면 할 수 있을 것이다.

728x90

'문제풀이 > 알고리즘 문제 풀이' 카테고리의 다른 글

[ 백준 16236 ] 아기 상어 (C++) - BFS  (1) 2024.09.11
[ 백준 1083 ] 소트 (C++) - 그리디  (4) 2024.09.07
[ 백준 1253 ] 좋다 (C++) - 투 포인터  (0) 2024.09.05
[ 백준 1106 ] 호텔 (C++) - 냅색, DP  (1) 2024.09.05
[ 백준 1327 ] 소트 게임 (C++) - BFS  (3) 2024.09.04
  1. 🔗 문제 링크
  2. 💡 문제 풀이 및 해석
  3. ⭐️ 정답 코드 및 설명
  4. 🤔 문제 후기
'문제풀이/알고리즘 문제 풀이' 카테고리의 다른 글
  • [ 백준 16236 ] 아기 상어 (C++) - BFS
  • [ 백준 1083 ] 소트 (C++) - 그리디
  • [ 백준 1253 ] 좋다 (C++) - 투 포인터
  • [ 백준 1106 ] 호텔 (C++) - 냅색, DP
RealTone
RealTone
풀스택 개발자되기 기원 1년차
개발공부 블로그풀스택 개발자되기 기원 1년차
RealTone
개발공부 블로그
RealTone
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자 공부 (8)
      • 인프라 - AWS (2)
      • Frontend - React (2)
      • Frontend - Next (2)
    • 구름톤트레이닝 (2)
      • 강의 후기 (0)
    • 문제풀이 (74)
      • 알고리즘 문제 풀이 (62)
      • SQL 문제 풀이 (12)
    • 개인 (0)
      • 멕북초기화세팅 (0)

블로그 메뉴

  • 홈
  • 태그
  • GitHub
  • 방명록

태그

  • AWS
  • baekjoon
  • CI/CD
  • codedeploy
  • ec2
  • G2
  • G3
  • G4
  • G5
  • git/github

최근 글

hELLO · Designed By 정상우.v4.2.2
RealTone
[ 백준 1197 ] 최소 스패닝 트리 (C++) - 최소 스패닝 트리
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.