happy318
팽도리블로그
happy318
전체 방문자
오늘
어제
  • 전체글 (252)
    • 공부 (5)
      • Algorithm 정리 (0)
      • 논문리뷰 (1)
      • C++ (2)
      • Python (2)
      • Java (0)
      • Back-end (0)
      • Front-end (0)
      • Embedded (0)
    • 코딩테스트 (218)
      • Python 문제풀이 (100)
      • C++ 문제풀이 (108)
      • Python template (9)
      • C++ template (1)
    • 일상 (20)
      • 맛집 (13)
      • 쇼핑 (5)
      • 아무 일상 (2)
    • 게임 (9)
      • 메이플스토리 (9)

최근 글

인기 글

hELLO · Designed By 정상우.
happy318

팽도리블로그

코딩테스트/C++ 문제풀이

[백준] 최소 스패닝 트리

2023. 2. 12. 23:19

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

우선 문제부터 간단하게 요약하면,

 

문제 제목에서 의미하는 것과 같이, 최소 신장 트리의 cost를 return 해야 하는 문제입니다.

 

<Solution>

최소 신장 트리는 Kruskal 알고리즘이나 Prim알고리즘을 사용한다고 합니다. 

 

Prim 알고리즘의 경우 아직 한번도 구현해 본적이 없어서 예전에 파이썬으로 구현해본 Kruskal알고리즘으로 구현하였습니다. 

 

실제 구현은 아래와 같습니다. 

#include <iostream>
#include <algorithm>

using namespace std;

struct edge{
    int s;
    int d;
    int cost;
};

edge edges[100000+10];

int parent[10000+10];

int V, E;
int ans;

bool Compare(const edge &e1, const edge &e2){
    return e1.cost < e2.cost;
}

int findParent(int v){
    if(parent[v] != v){
        parent[v] = findParent(parent[v]);
    }
    return parent[v];
}

void unionSet(int v1, int v2){
    int p1 = findParent(v1);
    int p2 = findParent(v2);
    
    if(p1 > p2){
        parent[p1] = p2;
    }
    else{
        parent[p2] = p1;
    }
}

int main(){
    // get input 
    cin >> V >> E;

    for(int i = 0; i<E; i++){
        cin >> edges[i].s >> edges[i].d >> edges[i].cost;
    }

    // initialize parent array
    for(int i = 1; i<=V; i++){
        parent[i] = i;
    }

    // sort edges
    sort(edges, edges+E, Compare);

    // looking for each edges, do Kruskal MST algorithm
    for(int i = 0; i<E; i++){
        edge* cur_e = edges+i;
        // if it doesn't make cycle, insert it in set
        if(findParent(cur_e->s) != findParent(cur_e->d)){
            unionSet(cur_e->s, cur_e->d);
            ans += cur_e->cost;
        }

    }

    cout << ans << endl;
}
반응형

'코딩테스트 > C++ 문제풀이' 카테고리의 다른 글

[백준] 두 배열의 합  (0) 2023.02.13
[백준] 다각형의 면적  (0) 2023.02.13
[백준] 벡터 매칭  (0) 2023.02.06
[백준] 알파벳  (0) 2023.02.05
[백준] 녹색 옷 입은 애가 젤다지?  (0) 2023.02.05
    '코딩테스트/C++ 문제풀이' 카테고리의 다른 글
    • [백준] 두 배열의 합
    • [백준] 다각형의 면적
    • [백준] 벡터 매칭
    • [백준] 알파벳
    happy318
    happy318

    티스토리툴바