본문 바로가기

[Algorithms]/[Problems]

BOJ. 16562번. 친구비

728x90

 

  평범한 disjoint-set문제. 나는 적용하기 쉬운 union-find로 해결했다. 다만 실수가 있었는데, parent배열을 다 구해놓고, 부모를 찾을 때, parent의 값을 그대로 사용했다;;; 최종적으로 루트값을 찾을때는 find함수를 사용하도록 하자!

 

www.acmicpc.net/problem/16562

 

16562번: 친구비

첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (

www.acmicpc.net

 

package week_13;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Day6BOJ16562친구비 {

	static int n,m,k;
	static int[] cost;
	static int[] parent;
	static boolean[] check;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken()); // 학생수
		m = Integer.parseInt(st.nextToken()); // 관계수
		k = Integer.parseInt(st.nextToken()); // 가진돈
		
		cost = new int[n+1]; // 친구비
		parent = new int[n+1];
		check = new boolean[n+1]; 
		for(int i=1; i<=n; i++) {
			parent[i] = i;
		}
		
		st = new StringTokenizer(br.readLine());
		for(int i=1; i<=n; i++) {
			cost[i] = Integer.parseInt(st.nextToken());
		}
		
		// 친구관계
		for(int i=0; i<m; i++) {	
			st = new StringTokenizer(br.readLine());
			int v = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			Union(v,w);
		}
		
		int minCost=0;
		for(int i=1; i<=n; i++) {
			int now = cost[i];
			if(check[i]) continue;
			for(int j=1; j<=n; j++) {
				if(find(i)==find(j)) {
					now = Math.min(now, cost[j]);
					check[j] = true;
				}
			}
			minCost += now;
			check[i] = true;
		}
		System.out.println((minCost<=k)?minCost:"Oh no");
		
	}
	
	private static int find(int a) {
		if(a == parent[a]) return a;
		return parent[a] = find(parent[a]);
	}
	
	private static boolean Union(int a, int b) {
		int aRoot = find(a);
		int bRoot = find(b);
		if(aRoot == bRoot) return false;
		parent[aRoot] = bRoot;
		return true;
	}

}
728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 1194번. 달이 차오른다 가자  (0) 2021.04.21
SWEA. 5607. 조합(페르마의 소정리)  (0) 2021.04.20
BOJ. 2933번. 미네랄,미네랄2  (0) 2021.04.16
BOJ. 11437번. LCA  (0) 2021.04.10
BOJ. 11657번. 타임머신  (0) 2021.04.09