위 문제와 같은 풀이방법입니다.
크루스칼과 프림 두 방법 모두 사용이 가능합니다.
[Kruskal]
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct Point {
int u;
int v;
int w;
};
vector<Point> list;
int parent[1001];
int N, M, ans, cnt;
bool cmp(Point a, Point b) {
if (a.w < b.w) return true;
else return false;
}
int find(int v) {
if (parent[v] == v) return v;
return parent[v] = find(parent[v]);
}
void Union(int x, int y, int w) {
int a = find(x);
int b = find(y);
if (a == b) return;
parent[b] = a;
ans += w;
cnt++;
}
void func() {
for (int i = 0; i < M; i++) {
int u = list[i].u;
int v = list[i].v;
int w = list[i].w;
Union(u, v, w);
if (cnt == N - 1) break;
}
cout << ans << '\n';
}
void init() {
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
}
void input() {
int u, v, w;
cin >> N >> M;
init();
for (int i = 0; i < M; i++) {
cin >> u >> v >> w;
list.push_back({ u,v,w });
}
sort(list.begin(), list.end(), cmp);
}
int main() {
cin.tie(NULL); cout.tie(NULL);
ios::sync_with_stdio(false);
input();
func();
return 0;
}
|
cs |
[Prim]
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<pair<int, int> > list[1001];
bool visit[1001];
int N, M, ans, cnt;
void func() {
priority_queue<pair<int, int> > q;
visit[1] = true;
for (int i = 0; i < list[1].size(); i++) {
q.push({ -list[1][i].second, list[1][i].first });
}
while (!q.empty()) {
int x = q.top().second;
int w = -q.top().first;
q.pop();
if (visit[x]) continue;
visit[x] = true;
ans += w;
cnt++;
if (cnt == N - 1) break;
for (int i = 0; i < list[x].size(); i++) {
int next = list[x][i].first;
int nextw = list[x][i].second;
q.push({ -nextw, next });
}
}
cout << ans << '\n';
}
void input() {
int u, v, w;
cin >> N >> M;
while (M--) {
cin >> u >> v >> w;
list[u].push_back({ v,w });
list[v].push_back({ u,w });
}
}
int main() {
cin.tie(NULL); cout.tie(NULL);
ios::sync_with_stdio(false);
input();
func();
return 0;
}
|
cs |
'algorithm > MST' 카테고리의 다른 글
boj 1647 도시 분할 계획 (0) | 2021.03.19 |
---|---|
boj 1197 최소 스패닝 트리 (0) | 2021.03.18 |