본문 바로가기
Problem Solving/백준

백준 4195 : 친구 네트워크

by Libi 2021. 8. 2.
반응형

https://www.acmicpc.net/problem/4195

 

4195번: 친구 네트워크

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

www.acmicpc.net

[ 문제풀이 ]

두 친구가 같은 그래프에 속하는지를 판단해야 하기 때문에 Union-Find 알고리즘을 활용하면 해결할 수 있다.

다만, 매번 두 친구가 속한 그래프의 정점의 개수를 탐색한다면 시간 초과가 발생할 것이다. 이를 위해 rank 배열을 하나 선언하여 각 정점마다 자식의 수를 관리해주도록 한다.

두 친구를 union할때 자식의 수가 많은 친구를 부모로 두 친구를 합해준다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;

public class Main {
	
	static int F;
	static int[] parent, rank;
	static Map<String, Integer> hm;
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			parent = new int[200001];
			rank = new int[200001];
			hm = new HashMap<>();
			
			int T = Integer.parseInt(br.readLine());
			while (T-- > 0) {
				F = Integer.parseInt(br.readLine());
				for (int i = 0; i < 200001; ++i) {
					parent[i] = i;
					rank[i] = 1;
				}
				for (int i = 0, count = 1; i < F; ++i) {
					String[] str = br.readLine().split(" ");
					if (!hm.containsKey(str[0])) hm.put(str[0], count++);
					if (!hm.containsKey(str[1])) hm.put(str[1], count++);
					
					bw.write(union(hm.get(str[0]), hm.get(str[1])) + "\n");
				}
				hm.clear();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static int getParent(int v) {
		return parent[v] == v ? v : (parent[v] = getParent(parent[v]));
	}
	
	public static int union(int a, int b) {
		a = getParent(a);
		b = getParent(b);
		
		if (a == b) return rank[a];
		
		if (rank[a] >= rank[b]) {
			parent[b] = a;
			rank[a] += rank[b];
			return rank[a];
		} else {
			parent[a] = b;
			rank[b] += rank[a];
			return rank[b];
		}
	}
}

 

 

반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 10159 : 저울  (0) 2021.08.04
백준 7570 : 줄 세우기  (0) 2021.08.03
백준 15486 : 퇴사 2  (0) 2021.08.01
백준 1027 : 고층 건물  (0) 2021.08.01
백준 1461 : 도서관  (0) 2021.07.31

댓글