Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- 문자열
- 조합
- C++ 1937
- DFS
- 16933
- c언어
- C++1167
- C++1967
- 가장 긴 증가하는 부분 수열
- 백트래킹
- 알고리즘
- 조합론
- LIS
- 투포인터
- 백준
- DP
- strtok
- C++ 1918
- 위상정렬
- C++
- BFS
- C++ 17071
- 순열
- 인덱스 트리
- 백준 17071
- 소트 게임
- Backtracking
- 백준 숨바꼭질5
- 프로그래머스
- 다익스트라
Archives
- Today
- Total
블로그
[6일차] 그래프1 C - 1922 : 네트워크 연결 본문
728x90
골드 Ⅳ
#include <iostream>
#include <queue>
using namespace std;
struct edgeInfo {
int node1, node2, weight;
};
struct compare {
bool operator()(const edgeInfo& edgeInfo1, const edgeInfo& edgeInfo2) {
return edgeInfo1.weight > edgeInfo2.weight;
}
};
priority_queue<edgeInfo, vector<edgeInfo>, compare>min_heap;
int N, M;
int parent[1001];
int find(int node) {
if (parent[node] == node) return node;
return parent[node] = find(parent[node]);
}
void uni(int node1, int node2) {
parent[find(node1)] = find(node2);
}
int main() {
scanf("%d%d", &N, &M);
//parent 배열 초기화
for (int i = 1; i <= N; i++) parent[i] = i;
//정보 입력받기
int a, b, c;
while (M--) {
scanf("%d%d%d", &a, &b, &c);
min_heap.push({ a, b, c });
}
int connectCnt = 0;
int weightSum = 0;
//크루스칼 알고리즘 진행
while (true) {
if (connectCnt == N - 1) break;
edgeInfo e = min_heap.top();
min_heap.pop();
//둘이 사이클을 안 만든다면
if (find(e.node1) != find(e.node2)) {
//이어줌
uni(e.node1, e.node2);
//간선 개수 증가
connectCnt++;
//가중치 더해주기
weightSum += e.weight;
}
}
printf("%d", weightSum);
}
크루스칼 알고리즘
(= 최소 스패닝 트리(=MST) 구하는 알고리즘)
(= union-find 사용)
간선들이 중심이 되는 알고리즘. 따라서
노드보다 간선들이 적을 때 유용
'SDS ( -> PS)' 카테고리의 다른 글
[6일차] 그래프1 F - 1516: 게임 개발 (0) | 2022.01.11 |
---|---|
[6일차] 그래프1 B - 2252 : 줄 세우기 (0) | 2022.01.10 |
[6일차] 그래프1 A - 1717: 집합의 표현 (0) | 2022.01.10 |
[5일차] 조합론 D - 1256 : 사전 (0) | 2022.01.09 |
[1일차] 알고리즘 기초 L - 15686 : 치킨 배달 (0) | 2022.01.09 |