개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • 문자열
  • MySQL
  • E-ROOM
  • Programmers
  • java
  • 그리디
  • 브루트포스
  • boj
  • SQL
  • elasticsearch
  • 백트래킹
  • 백준
  • 구현
  • 독서
  • briefing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

💡 Problem Solving/Baekjoon

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

2023. 10. 20. 19:44
728x90
반응형

1. 문제

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

 

2. 풀이

크루스칼 문제이다.

1. 간선을 가중치를 기준으로 정렬한다.
2. 사이클이 생기지 않는 경우 반복하여 합친다. (사이클의 판정은 unino-find를 사용)

3. 합쳐진 간선의 개수가 (정점의 개수 - 1)인 경우, MST가 완성되었으므로 종료한다.

 

3. 문제

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

using namespace std;
int V, E;
bool visited[10010];
int ans;
int parent[10010];
int edgeCount;

class Edge {
public:
    int a;
    int b;
    int weight;
    Edge(int a, int b, int w) {
        this->a = a;
        this->b = b;
        this->weight = w;
    }
};

vector<Edge> edges;

bool compare(Edge& a, Edge& b) {
    return a.weight < b.weight;
}

int find(int x) {
    if(x == parent[x]) return x;
    else return parent[x] = find(parent[x]);
}

void Union(int x, int y) {

    int px = find(x);
    int py = find(y);

    if(px != py) {
        parent[px] = py;
    }

}

// 1197
/* 
    크루스칼 알고리즘
    1. 가중치를 기준으로 정렬한다.
    2. 사이클이 생기지 않는 경우에 합친다. (사이클의 판정은 unino-find를 사용)
    3. 합쳐진 간선의 개수가 (정점의 개수 - 1)인 경우, MST가 완성되었으므로 종료한다.
*/
int main() {

    cin >> V >> E;

    for(int i=1; i<=10000; i++) parent[i] = i;

    for(int i=0; i<E; i++) {
        int a, b, w;
        cin >> a >> b >> w;
        
        edges.push_back(Edge(a, b, w));
    }

    sort(edges.begin(), edges.end(), compare);

    for(int i=0; i<edges.size(); i++) {
        int x = edges[i].a;
        int y = edges[i].b;
        int w = edges[i].weight;
        if(find(x) != find(y)) {
            Union(x, y);
            ans += w;
            edgeCount++;
            if(edgeCount == V-1) break;
        }
    }

    cout << ans;
    return 0;
}
728x90
반응형
저작자표시 (새창열림)

'💡 Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 - 4358] 생태학 [C++]  (0) 2023.10.22
[백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]  (0) 2023.10.20
[백준 - 7490] 0 만들기 [C++]  (0) 2023.10.19
[백준 - 1629] 곱셈 [C++]  (0) 2023.10.19
[백준 - 11286] 절댓값 힙 [C++]  (0) 2023.10.18
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 4358] 생태학 [C++]
    • [백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]
    • [백준 - 7490] 0 만들기 [C++]
    • [백준 - 1629] 곱셈 [C++]
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바