본문 바로가기
Computer Science

고속도로 건설 2 넌 is 뭔들

by OKOK 2019. 3. 6.

1. MST
2. 도로 건설

3. 모든 정점이 이어지는데, 가중치의 합이 최소인 것

4. 프림, 크루스칼

5. 오케이 유니온 파인드 


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
#include<stdio.h>
 
#define MAX 10
//#define MAX 5000001
 
typedef struct {
    int u, v, w;
} EDGE;
EDGE G[MAX];
 
int P[MAX];  /* Parent */
int R[MAX];  /* Rank */
 
#define Swap(a, b) { EDGE t = a; a = b; b = t; }
 
void QSort(int l, int r) {
    int i = l, j = r;
    int p = G[(l + r) / 2].w;
 
    while (i <= j) {
        while (G[i].w < p) ++i;
        while (G[j].w > p) --j;
        if (i <= j) { Swap(G[i], G[j]); ++i; --j; }
    }
    if (l < j) QSort(l, j);
    if (i < r) QSort(i, r);
}
int FindSet(int u) {
    if (u == P[u]) return u;
    return P[u] = FindSet(P[u]);
}
void UnionSet(int u, int v) {
    u = FindSet(u);
    v = FindSet(v);
    if (u == v) return;
 
    if (R[u] > R[v]) { int t = u; u = v; v = t; }
    P[u] = v;
    if (R[u] == R[v]) ++R[u];
}
int main() {
    freopen("input.txt""r", stdin);
    int T, t, N, M, i, ec, mc;
    scanf("%d"&T);
    for (t = 1; t <= T; ++t) {
        scanf("%d %d"&N, &M);
        for (i = ec = 0; i < M; ++i, ++ec)
            scanf("%d %d %d"&G[i].u, &G[i].v, &G[i].w), P[i] = i, R[i] = 0;
 
        QSort(0, ec - 1);
        for (mc = i = 0; i < ec; ++i) {
            if (FindSet(G[i].u) == FindSet(G[i].v)) continue;
            mc += G[i].w;
            UnionSet(G[i].u, G[i].v);
        }
        printf("#%d %d\n", t, mc);
    }
    return 0;
}
 
cs

 


'Computer Science' 카테고리의 다른 글

중고차 솔루션  (0) 2019.03.08
인터프리터 해적  (0) 2019.03.08
Inversion Counting 삼슝  (0) 2019.03.06
Pole 아메리칸 조식  (0) 2019.03.05
파이의 합 아메리칸 조식  (0) 2019.03.05

댓글