Notice
Recent Posts
문제 풀이 및 개발 공간
[백준] 20955번 민서의 응급 수술 (gold 4 본문
import java.io.*;
import java.util.*;
public class Main{
static int[] num;
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st=new StringTokenizer(br.readLine());
int n=Integer.valueOf(st.nextToken());
int m=Integer.valueOf(st.nextToken());
num=new int[n+1];
for(int i=1; i<=n; i++){
num[i]=i;
}
int answer=0;
for(int i=0; i<m; i++){
st=new StringTokenizer(br.readLine());
int a=Integer.valueOf(st.nextToken());
int b=Integer.valueOf(st.nextToken());
int fa=Find(a);
int fb=Find(b);
//이미 연결된 경우
//또 연결하면 사이클 발생 하므로 끊기
if(fa==fb){
answer++;
continue;
}
//연결되어 있다고 하니 제시문 대로 연결
else{
Union(a,b);
}
}
boolean[] visit=new boolean[n+1];
//각 점들의 대표 수를 확인.
//등록 안되어있으면 등록, 대표 수가 다르다는 건 다른 집합에 속한다는 의미
//다른 집합에 속하는 경우마다 +1;
//이때 기준이 되는 집합이 있다고 할 때 그 대표수를 체크하려고 +1 된 상태이므로
//마지막 답에서 -1을 해줘야함.
for(int i=1; i<=n; i++){
int temp=Find(i);
if(!visit[temp]){
visit[temp]=true;
answer++;
}
}
bw.write(answer-1+"");
bw.flush();
}
public static int Find(int v){
if(v==num[v]){
return v;
}
else{
return num[v]=Find(num[v]);
}
}
public static void Union(int a, int b){
int fa=Find(a);
int fb=Find(b);
if(fa!=fb){
num[fa]=fb;
}
}
}
'백준공부 > java' 카테고리의 다른 글
[백준] 25706번 자전거 묘기 (silver 4 (0) | 2024.03.15 |
---|---|
[백준] 10610번 30 (silver 4 (0) | 2024.03.15 |
[백준] 2812번 크게 만들기 (gold 3 (0) | 2024.03.15 |
[백준] 1717번 집합의 표현 (gold 5 (0) | 2024.03.14 |
[백준] 2535번 아시아 정보올림피아드 (silver 5 (0) | 2024.03.13 |