본문 바로가기
알고리즘 문제풀이/백준

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

by m2162003 2021. 1. 26.

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

mst 구현 문제

크루스칼 알고리즘을 사용하여 풀었다.

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

struct s
{
  int a, b, cost;
};

int parent[10001];
vector<s> vs;
int v, e;
bool cmp(const s &t1, const s &t2)
{
  return t1.cost < t2.cost;
}

int find_parent(int node)
{
  if (parent[node] == node)
    return node;

  return parent[node] = find_parent(parent[node]);
}

void union_parnet(int n1, int n2)
{
  int np1 = find_parent(n1);
  int np2 = find_parent(n2);

  if (np1 < np2)
    parent[np2] = np1;
  else
    parent[np1] = np2;
}

bool is_cycle(int n1, int n2)
{
  if (find_parent(n1) == find_parent(n2))
    return true;
  else
    return false;
}

int main(void)
{
  scanf("%d%d", &v, &e);

  for (int i = 1; i <= v; i++)
  {
    parent[i] = i;
  }

  for (int i = 1; i <= e; i++)
  {
    int e1, e2, c;
    scanf("%d%d%d", &e1, &e2, &c);
    vs.push_back({e1, e2, c});
  }

  sort(vs.begin(), vs.end(), cmp);
  int res = 0;
  for (int i = 0; i < vs.size(); i++)
  {
    if (!is_cycle(vs[i].a, vs[i].b))
    {
      res += vs[i].cost;
      union_parnet(vs[i].a, vs[i].b);
    }
  }

  printf("%d\n", res);

  return 0;
}

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

[백준 11660] 구간 합 구하기 5  (0) 2021.01.28
[백준 2630] 색종이 만들기  (0) 2021.01.27
[백준 9372] 상근이의 여행  (0) 2021.01.25
[백준 1080] 행렬  (0) 2021.01.24
[백준 1520] 내리막 길  (0) 2021.01.23

댓글