본문 바로가기
백준

백준 4195 친구 네트워크

by 콩순이냉장고 2020. 8. 30.

문제 URL : https://www.acmicpc.net/problem/4195

 

4195번: 친구 네트워크

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

www.acmicpc.net

 

문제 접근법 :  string 을이용한 disjoint set문제입니다.

정수형이 아니기때문에 parent 인덱스를 string으로 사용해야하기 때문에

인덱스를 string을 사용할수 있는 자료구조는 hash_map =  unordered_map 이나 map 을 이용해서 풀수있지만

단순히 떠바른 알고리즘을 사용하기위해 저는 unordered_map을 이용했습니다.

서로다른 루트일때 합칠경우 해당루트의 갯수들을 더해서 계산결과를 내면되기때문에

골드2 문제라고 하기엔 좀 아닌듯한 문제였습니다. 생각보다 쉬워서

 

소스코드 : 

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
//By 콩순이냉장고
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
unordered_map<string,pair<string,int>> parent;
string find(string idx)
{
    if (parent[idx].first == idx)
        return idx;
    return parent[idx].first = find(parent[idx].first);
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int test;
    cin >> test;
    while (test--)
    {
        int n;
        cin >> n;
        parent.clear();
        for (int i = 0; i < n; i++)
        {
            string a, b;
            cin >> a >> b;
            if (!parent.count(a))
                parent[a] = { a, 1 };
            if (!parent.count(b))
                parent[b] = { b, 1 };
            a = find(a);
            b = find(b);
        
            if (a != b)
            {
                int cnt = parent[b].second;
                parent[b] = parent[a];
                parent[a].second += cnt;
            }
            cout << parent[a].second << "\n";
        }
    }
}
cs

 

모르는점 혹은 궁금한점 혹은 무엇인가 오류가 있다면 언제든지 댓글을 이용해주시길 바랍니다.

 

'백준' 카테고리의 다른 글

백준 10216 Count Circle Groups  (0) 2020.10.02
백준 5373 큐빙(SW 역량 테스트 기출 문제)  (0) 2020.09.21
백준 4386 별자리 만들기  (0) 2020.08.30
백준 1922 네트워크 연결  (0) 2020.08.30
백준 5557 1학년  (0) 2020.08.26