728x90
반응형
단순 최소 스패닝 트리를 구하는 문제!
위 문제처럼 크루스칼이나 프림을 사용하면 된다고 생각해, 좀 더 쓰기 번거롭지 않은 크루스칼 + 메모이제이션을 이용했다.
코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int parents[1001];
// 간선
struct Edge
{
int a, b, w;
bool operator < (const Edge& e) const
{
return w < e.w;
}
};
// 최상위 부모 찾기
int find(int v)
{
vector<int> vec;
while (v != parents[v])
{
vec.push_back(v);
v = parents[v];
}
// 메모이제이션
for (int i : vec)
{
parents[i] = v;
}
return v;
}
int main()
{
int vCnt, lCnt;
long long int result = 0;
vector<Edge> edges;
cin >> vCnt >> lCnt;
for (int i = 0; i <= vCnt; i++)
parents[i] = i;
for (int i = 0; i < lCnt; i++)
{
int a, b, w;
cin >> a >> b >> w;
edges.push_back({ a,b,w });
}
// 가중치 기준 오름차순 정렬
sort(edges.begin(), edges.end());
for (int i = 0; i < edges.size(); i++)
{
int fa = find(edges[i].a), fb = find(edges[i].b);
// 사이클이 생기지 않는다면
// 간선 선택
if (fa != fb)
{
result += edges[i].w;
parents[fa] = fb;
}
}
cout << result;
}
단순하게 최소 스패닝 트리 구현 문제였지만, 다음에는 최소 스패닝 트리를 이용한 응용 문제를 풀어보고 싶다!!!!
728x90
반응형
'알고리즘 문제풀이 > 그래프 탐색' 카테고리의 다른 글
[백준][C++] 1774 우주신과의 교감 (0) | 2022.11.03 |
---|---|
[백준][C++] 21924 도시 건설 (0) | 2022.11.03 |
[백준][C++] 16398 행성 연결 (0) | 2022.11.03 |
[백준][C++] 1647 도시 분할 계획 (0) | 2022.11.03 |
[백준][C++] 1197 최소 스패닝 트리 (0) | 2022.11.03 |