반응형
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
#문제 간단 정리
최소 스패닝 트리를 구현하는되는 문제
즉 크루스칼 알고리즘이랑
프림 알고리즘을 구현하면 되는 문제이다
https://yabmoons.tistory.com/191
[ 백준 1197 ] 최소 스패닝 트리 (C++)
백준의 최소스패닝트리(1197) 문제이다.[ 문제 바로가기 ] [ 문제 풀이]1) 이 문제는 Minimal Spanning Tree를 구현해야 하는 문제이다. 크루스칼 알고리즘을 이용하면 쉽게 구할 수 있다. 아직 크루스칼
yabmoons.tistory.com
이 블로그에 크루스칼이 잘 정리 되어있으니까 모른다면 참고하면 좋을 것 같다.
#문제 해결 방법
유니온 파인드를 우선 구현하고 그 이후에
크루스칼을 구현하면 된다.
#전체 코드
#include <iostream>
#include <cstring>
#include <climits>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX 10001
int Parent[MAX];
vector<pair<int, pair<int, int>>> V;
int Find(int x) {
if (Parent[x] == x) return x;
else return Parent[x] = Find(Parent[x]);
}
void Union(int x, int y) {
x = Find(x);
y = Find(y);
if (x != y) Parent[y] = x;
}
bool SameParent(int x, int y) {
x = Find(x);
y = Find(y);
if (x == y) return true;
else return false;
}
int main() {
int Vertex, E, Answer=0;
cin >> Vertex >> E;
for (int i = 0; i < E; i++) {
int From, To, Cost;
cin >> From >> To >> Cost;
V.push_back(make_pair(Cost, make_pair( From,To )));
}
sort(V.begin(), V.end());
for (int i = 1; i <= Vertex; i++) {
Parent[i] = i;
}
for (int i = 0; i < E; i++) {
if (SameParent(V[i].second.first, V[i].second.second) == false) {
Union(V[i].second.first, V[i].second.second);
Answer = Answer + V[i].first;
}
}
cout << Answer << '\n';
return 0;
}
반응형
'[백준] > C++' 카테고리의 다른 글
백준 20040번 사이클 게임 [C++] (0) | 2024.03.10 |
---|---|
백준 2550번 전구 [C++] (0) | 2024.03.09 |
백준 16139번 인간-컴퓨터 상호작용 [C++] (2) | 2024.02.25 |
백준 1012번 유기농 배추 [C++] (0) | 2024.02.24 |
백준 2615번 오목 [C++] (0) | 2024.02.22 |