코딩 공부/백준

[백준][C++] 4195 친구 네트워크

김 정 환 2021. 4. 16. 20:27
반응형

www.acmicpc.net/problem/4195

 

4195번: 친구 네트워크

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스의 첫째 줄에는 친구 관계의 수 F가 주어지며, 이 값은 100,000을 넘지 않는다. 다음 F개의 줄에는 친구 관계가 생긴 순서대로 주어진

www.acmicpc.net

 

 

 

알고리즘 종류

부분 집합

자료 구조

 

 

 

사고 과정

부분 집합을 할 parents 배열을 만듭니다. 그리고 몇 명이 연결되어 있는지 기록할 state라는 배열을 만듭니다. 이후 union_find으로 해결하면 됩니다.

 

 

 

구현(C++)

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
#include <iostream>
#include <string>
#include <map>
#include <vector>
#define endl "\n"
 
using namespace std;
 
 
int tc, n;
 
map<stringint> m;
int parents[200001];
int state[200001];
 
 
int get_parent(int a){
    if(parents[a] == a) return a;
    return parents[a] = get_parent(parents[a]);
}
 
 
void union_parents(int a, int b){
 
    a = get_parent(a);
    b = get_parent(b);
 
    if(a>b){
        parents[a] = b;
        
        int tmp = state[b];
        state[b] += state[a];
        state[a] += tmp;
    }
    else{
        parents[b] = a;
        
        int tmp = state[a];
        state[a] += state[b];
        state[b] += tmp;
    }
}
 
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);    
    cin >> tc;
    
    for(int t=0; t<tc; t++){
        
        cin >> n;
 
        for(int i=0; i<200001; i++){
            parents[i] = i;
            state[i] = 1;
        }
        
        m.clear();
        int num=1;
        string s1, s2;
        
        for(int i=0; i<n; i++){
            cin >> s1 >> s2;
            
            if(m[s1] == 0) m[s1] = num ++;
            if(m[s2] == 0) m[s2] = num ++;
            
            int a = get_parent(m[s1]);
            int b = get_parent(m[s2]);
            
            if(a != b) union_parents(a, b);
 
            cout << max(state[a], state[b]) << endl;                                                   
        }
    }
}
cs

 

 

 

 

시행착오

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 13308 주유소  (0) 2021.04.17
[백준][C++] 1162 도로포장  (0) 2021.04.17
[백준][C++] 10775 공항  (0) 2021.04.16
[백준][C++] 2170 선 긋기  (0) 2021.04.16
[백준][C++] 16198 에너지 모으기  (0) 2021.04.15