티스토리 뷰
반응형
✏️ 문제 링크
https://www.acmicpc.net/problem/14621
✏️ 문제 설명
✏️ 문제 풀이
최소 신장 트리를 구현하는 문제입니다.
기본적인 MST구현 알고리즘에서 조건을 1가지만 추가하면 됩니다.
기존의 MST는 부모 노드가 다르다면 Union을 하지만, 위 문제는 남초대학교와 여초대학교라는 조건이 있습니다.
따라서, Union을 하기 위해서는 두 노드의 학교 성별이 달라야 하고 부모 노드가 달라야 합니다.
그리고 주의할 점이 1가지 있습니다. 바로 모든 학교를 연결하는 경로가 없을 때입니다.
보통의 MST문제는 모든 노드를 연결하게 문제를 내주어서(보통 반복문 종료 조건이 사용한 에지 개수 =N-1)그냥 풀면
되지만 이 문제는 모든 학교를 연결하는 경로가 없을수도 있습니다. 따라서 이를 판별해주는 변수 isMST를 만들었습니다.
반복문을 M개만큼 돌리면서 만약 에지의 개수가 N-1이 된다면 isMST=true로 만들고 반복문을 종료시킵니다.
✏️ 문제 코드
#include<iostream>
#include<queue>
#include<vector>
#include<set>
using namespace std;
typedef struct Edge {
int start, end, value;
bool operator > (const Edge& temp)const {
return value > temp.value;
}
}Edge;
int N, M, s, e, v;
vector<char>collage;
vector<int>parent;
set<int>mySet;
void Union(int a, int b);
int find(int a);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
collage.resize(N + 1);
for (int i = 1; i <= N; i++)
cin >> collage[i];
parent.resize(N + 1);
for (int i = 1; i <= N; i++)
parent[i] = i;
priority_queue<Edge, vector<Edge>, greater<Edge>>pq;
for (int i = 0; i < M; i++) {
cin >> s >> e >> v;
pq.push(Edge{ s,e,v });
}
int rSum = 0, usedEdge = 0;
bool isMST = false;
while (M--) {
Edge tmp = pq.top();
pq.pop();
int start = tmp.start;
int end = tmp.end;
int value = tmp.value;
if (collage[start] != collage[end]) {
if (find(start) != find(end)) {
Union(start, end);
rSum += value;
usedEdge++;
}
}
if (usedEdge == N - 1) {
isMST = true;
break;
}
}
if (isMST)
cout << rSum;
else
cout << -1;
}
void Union(int a, int b)
{
int node1 = find(a);
int node2 = find(b);
if (node1 != node2) {
if (node1 > node2)
parent[node1] = node2;
else
parent[node2] = node1;
}
}
int find(int a)
{
if (a == parent[a])
return a;
else
return parent[a] = find(parent[a]);
}
✏️ 더 보기
https://pooreumjung.tistory.com/326
https://pooreumjung.tistory.com/332
https://pooreumjung.tistory.com/302
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[C/C++] 백준 19975번 - 수열과 쿼리 21 (0) | 2024.04.12 |
---|---|
[C/C++] 백준 10999번 - 구간 합 구하기 2 (0) | 2024.04.12 |
[C/C++] 백준 10423번 - 전기가 부족해 (0) | 2024.04.11 |
[C/C++] 백준 1738번 골목길 (0) | 2024.04.10 |
[C/C++] 백준 5676번 - 음주 코딩 (0) | 2024.04.09 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- C++ Stack
- 카운팅 정렬
- java
- Do it!
- 유클리드 호제법
- 유니온 파인드
- DP
- 자바
- CSS
- 에라토스테네스의 체
- 백준 풀이
- c++ string
- BFS
- js
- 자바스크립트
- DFS
- 우선순위 큐
- html
- C++
- 반복문
- 백준
- 이분 매칭
- HTML5
- 알고리즘
- 스택
- 투 포인터
- 스프링 부트 crud 게시판 구현
- 세그먼트 트리
- 자료구조
- 알고리즘 공부
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함