문제
1922번: 네트워크 연결
이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.
www.acmicpc.net

풀이
최소 스패닝 트리, 크루스칼 알고리즘 문제이다.
[백준][C++] 1197: 최소 스패닝 트리
문제 풀이 크루스칼 알고리즘을 이용하였다. 가중치가 작은 순서대로 검사할 수 있도록 간선을 가중치의 오름차순으로 정렬한다. 검사하는 간선이 사이클을 만들지 않다면 간선을 선택한다. 간
kantatatam.tistory.com
최소 스패닝 트리, 크루스칼 알고리즘의 기본 문제로 위의 문제와 풀이가 같다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct
{
int v1;
int v2;
int dist;
}edge;
int parent[1001];
bool compare(edge a, edge b)
{
return a.dist < b.dist;
}
int getParent(int n)
{
if (n == parent[n])
{
return n;
}
return getParent(parent[n]);
}
bool cycle(int n1, int n2)
{
n1 = getParent(n1);
n2 = getParent(n2);
return n1 == n2;
}
void Union(int n1, int n2)
{
int p1 = getParent(n1);
int p2 = getParent(n2);
if (p1 < p2)
{
parent[p2] = p1;
}
else
{
parent[p1] = p2;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<edge> edges;
for (int i = 0; i < M; ++i)
{
int a, b, c;
cin >> a >> b >> c;
edges.push_back({ a, b, c });
}
sort(edges.begin(), edges.end(), compare);
for (int i = 1; i <= N; ++i)
{
parent[i] = i;
}
int answer = 0;
for (auto edge : edges)
{
if (!cycle(edge.v1, edge.v2))
{
Union(edge.v1, edge.v2);
answer += edge.dist;
}
}
cout << answer;
return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 17472: 다리 만들기 2 (1) | 2023.12.24 |
---|---|
[백준][C++] 4386: 별자리 만들기 (1) | 2023.12.22 |
[백준][C++] 5719: 거의 최단 경로 (1) | 2023.12.21 |
[백준][C++] 1854: K번째 최단경로 찾기 (1) | 2023.12.18 |
[백준][C++] 2211: 네트워크 복구 (1) | 2023.12.17 |
문제
1922번: 네트워크 연결
이 경우에 1-3, 2-3, 3-4, 4-5, 4-6을 연결하면 주어진 output이 나오게 된다.
www.acmicpc.net

풀이
최소 스패닝 트리, 크루스칼 알고리즘 문제이다.
[백준][C++] 1197: 최소 스패닝 트리
문제 풀이 크루스칼 알고리즘을 이용하였다. 가중치가 작은 순서대로 검사할 수 있도록 간선을 가중치의 오름차순으로 정렬한다. 검사하는 간선이 사이클을 만들지 않다면 간선을 선택한다. 간
kantatatam.tistory.com
최소 스패닝 트리, 크루스칼 알고리즘의 기본 문제로 위의 문제와 풀이가 같다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct
{
int v1;
int v2;
int dist;
}edge;
int parent[1001];
bool compare(edge a, edge b)
{
return a.dist < b.dist;
}
int getParent(int n)
{
if (n == parent[n])
{
return n;
}
return getParent(parent[n]);
}
bool cycle(int n1, int n2)
{
n1 = getParent(n1);
n2 = getParent(n2);
return n1 == n2;
}
void Union(int n1, int n2)
{
int p1 = getParent(n1);
int p2 = getParent(n2);
if (p1 < p2)
{
parent[p2] = p1;
}
else
{
parent[p1] = p2;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
cin >> N >> M;
vector<edge> edges;
for (int i = 0; i < M; ++i)
{
int a, b, c;
cin >> a >> b >> c;
edges.push_back({ a, b, c });
}
sort(edges.begin(), edges.end(), compare);
for (int i = 1; i <= N; ++i)
{
parent[i] = i;
}
int answer = 0;
for (auto edge : edges)
{
if (!cycle(edge.v1, edge.v2))
{
Union(edge.v1, edge.v2);
answer += edge.dist;
}
}
cout << answer;
return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글
[백준][C++] 17472: 다리 만들기 2 (1) | 2023.12.24 |
---|---|
[백준][C++] 4386: 별자리 만들기 (1) | 2023.12.22 |
[백준][C++] 5719: 거의 최단 경로 (1) | 2023.12.21 |
[백준][C++] 1854: K번째 최단경로 찾기 (1) | 2023.12.18 |
[백준][C++] 2211: 네트워크 복구 (1) | 2023.12.17 |