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

2022. 9. 5. 00:26·🍞 Algorithm/Baekjoon
https://www.acmicpc.net/problem/4195 
 

4195번: 친구 네트워크

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

www.acmicpc.net

 

풀이과정

이 문제는 유니온 파인드와 map 알고리즘이 섞인 문제이다.  
유니온 파인드 알고리즘을 하려면, 처음에 parent 배열에 각자 자신의 번호로 초기화시켜준다.  
한 줄에 2명씩 입력되므로 최대 노드 개수는 2 * F 개가 된다.

입력을 받을 때, 만약 map.count가 0이라면 idx를 넣어주고 1씩 플러스 해준다.  
그다음 unionParent 함수를 실행하고, 다른 집합일 경우에는  
부모 노드가 크거나 작거나에 상관없이 일단 집합을 연결해준다.

res[a]에 res[b]를 더하며 최종적으로 res[a]를 리턴하게 한다.  
res[b]값을 1로 만드는 이유는 나중에 다른 곳에서 쓰일 수도 있기 때문이다.

 

#include <algorithm>
#include <iostream>
#include <map>
using namespace std;

int T, F;
int parent[200001], res[200001];
string a, b;

// 부모 노드를 찾는 함수
int getParent(int x) {
	if (parent[x] == x) return x;
	return parent[x] = getParent(parent[x]);
}

// 두 집합을 합치는 함수
int unionParent(int a, int b) {
	a = getParent(a);
	b = getParent(b);
	if (a != b) { // 다른 집합
		parent[b] = a; // 집합 연결
		res[a] += res[b];
		res[b] = 1;
	}
	return res[a];
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin >> T;
	while (T--) {
		cin >> F;
		// 한 줄에 2명씩 입력되므로 최대 노드개수 2 * F
		for (int i = 1; i <= 2 * F; i++) {
			parent[i] = i;
			res[i] = 1; // 총 연결된 노드 개수
		}
		int idx = 1;
		map <string, int> name;
		for (int i = 0; i < F; i++) {
			cin >> a >> b;
			if (name.count(a) == 0) name[a] = idx++;
			if (name.count(b) == 0) name[b] = idx++;
			cout << unionParent(name[a], name[b]) << "\n";
		}
	}
}
저작자표시 (새창열림)

'🍞 Algorithm > Baekjoon' 카테고리의 다른 글

[백준] 15809 전국시대 c++  (0) 2022.09.05
[백준] 1939 중량제한 c++  (0) 2022.09.05
[백준] 20040 사이클 게임 c++  (0) 2022.09.05
[백준] 16562 친구비 c++  (0) 2022.09.05
[백준] 1976 여행 가자 c++  (0) 2022.09.05
'🍞 Algorithm/Baekjoon' 카테고리의 다른 글
  • [백준] 15809 전국시대 c++
  • [백준] 1939 중량제한 c++
  • [백준] 20040 사이클 게임 c++
  • [백준] 16562 친구비 c++
박빵이
박빵이
2025년에도 갓생살기
  • 박빵이
    기억보다 기록
    박빵이
  • 전체
    오늘
    어제
    • 분류 전체보기 (337)
      • 🍞 FrontEnd (97)
        • HTML+CSS (4)
        • JavaScript (17)
        • TypeScript (4)
        • React (52)
        • Next.js (2)
        • Android (15)
      • 🍞 BackEnd (24)
        • Java (15)
        • Node.js (6)
        • Spring (1)
      • 🍞 Cloud & Infra (0)
        • AWS SAA (0)
        • Microsoft Azure (0)
      • 🍞 Algorithm (147)
        • C++ (4)
        • Baekjoon (41)
        • Programmers (97)
      • 🍞 Computer Science (18)
        • 운영체제 (1)
        • 데이터 통신 (6)
        • 네트워크 (6)
        • 데이터베이스 (1)
      • 🍞 대외활동 & 부트캠프 (42)
        • 삼성 청년 SW 아카데미 (1)
        • LG유플러스 유레카 (0)
        • 한국대학생IT경영학회 (1)
        • IT연합동아리 UMC (17)
        • 길벗 블로깅 멘토 (18)
        • IT연합동아리 피로그래밍 (3)
        • 개발 컨퍼런스 (2)
  • 블로그 메뉴

    • Admin
  • 링크

    • GitHub
  • 인기 글

  • 태그

    백준
    유니온파인드
    JavaScript
    react
    Android
    알고리즘
    level1
    위상정렬
    길벗 블로깅 멘토링
    길벗 블로깅 멘토
    map
    코딩자율학습
    프로그래머스
    umc
    C++
    Front
    level2
    안드로이드
    코틀린
    Java
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
박빵이
[백준] 4195 친구 네트워크 c++
상단으로

티스토리툴바