본문 바로가기

알고리즘/BOJ

4195번

4195번 - 친구 네트워크


이 문제는 union-find 를 이용해서 문제를 풀었다. 추가적으로 STL 의 map 을 이용했다.


다른 분들 코드를 보니 각 노드에 번호를 다시 매겨서 그 번호를 이용해서 문제를 푸신다.


나는 map 에서 string 을 배열의 인덱스로 사용할 수 있으니 , 그냥 string 을 사용해서 문제를 풀었다.


(그런데 이게 다른 문제에서는 메모리 오류나, 시간 오류가 발생하는 지는 모르겠다 <-- 확인해볼 사항)


그리고 사이즈를 구하는 배열을 따로 추가해서, 각 트리의 사이즈를 알 수 있게 만들어서, 그걸 출력했다.


그런데 여러가지 궁금증 발생 => 아래 질문들


갓들은 대단하다 정말.....


<내가 올린 질문>



<답변>




<정답 코드 - 질문 후>


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
75
76
77
78
79
80
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
 
map<string,string> prt;
map<string,int> s;
map<string,int> r;
 
 
string find(string x)
{
    if (x == prt[x])
    {
        return x;
    }
 
    return prt[x] = find(prt[x]);
}
void merge(string x, string y)
{
    x = find(x);
    y = find(y);
    if (x == y)
    {
        return;
    }
 
    if (r[x] > r[y]) { swap(x, y); }
 
    prt[x] = y;
 
    if (r[x] == r[y]) { r[y]++; }
 
    s[y] += s[x];
 
    return;
}
int main()
{
    int tc;
    cin >> tc;
    for (int t = 1; t <= tc; t++)
    {
        int N;
        prt.clear();
        s.clear();
        r.clear();
        cin >> N;
        
        for (int i = 0; i < N; i++)
        {
            char a[30];
            char b[30];
            scanf("%s",a);
            scanf("%s",b);
            
            if (prt.count(a) == 0)
            {
                prt[a] = a;
                s[a] = 1;
                r[a] = 1;
            }
            if(prt.count(b)==0)
            {
                prt[b] = b;
                s[b] = 1;
                r[b] = 1;
            }
 
            merge(a, b);
 
            printf("%d\n", s[find(a)]);
        }
 
    }
    
    return 0;
}
cs





<정답 코드 - 질문 이전>


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
#include<iostream>
#include<vector>
#include<map>
#include<string>
using namespace std;
 
map<stringstring> prt;
map<string,int> s;
 
string find(string x)
{
    if (x == prt[x])
    {
        return x;
    }
 
    return prt[x] = find(prt[x]);
}
void merge(string x, string y)
{
    x = find(x);
    y = find(y);
    if (x == y)
    {
        return;
    }
 
    prt[x] = y;
    s[y] += s[x];
    
 
    return;
}
int main()
{
    int tc;
    cin >> tc;
    for (int t = 1; t <= tc; t++)
    {
        int N;
        s.clear();
        prt.clear();
        cin >> N;
        
        for (int i = 0; i < N; i++)
        {
            char a[30];
            char b[30];
            scanf("%s",a);
            scanf("%s",b);
            
            if (prt.count(a) == 0)
            {
                prt[a] = a;
                s[a] = 1;
            }
            if(prt.count(b)==0)
            {
                prt[b] = b;
                s[b] = 1;
            }
 
            merge(a, b);
 
            printf("%d\n", s[prt[b]]);
        }
 
    }
    
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

1927번(우선순위 큐 다시풀기)  (0) 2017.12.20
11279번(우선순위 큐 다시풀기)  (0) 2017.12.20
1976번  (0) 2017.12.19
1717번  (0) 2017.12.19
3015번  (0) 2017.12.19