[정보올림피아드] 1863. 종료 (Union-find, 시간제한)
728x90
반응형
scanner로 입력받으면 시간 초과한다.
union으로 합칠 때 트리 깊이가 더 작은 것을 더 큰 것에 붙여줘야한다. 안 그러면 시간 초과난다.
(다른 애들을 검사할 때 깊이가 점점 더 깊어지기 때문에)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Scanner;
import java.util.StringTokenizer;
// 정올 1863 종료
public class Main {
static int n,m;
static int[] parent;
static int[] depth;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
StringTokenizer st=new StringTokenizer(str);
n=Integer.parseInt(st.nextToken());
m=Integer.parseInt(st.nextToken());
parent=new int[n+1];
depth=new int[n+1];
for (int i = 1; i <=n; i++) {
parent[i]=i;
depth[i]=1;
}
for (int i = 0; i < m; i++) {
str=br.readLine();
st=new StringTokenizer(str);
int a=Integer.parseInt(st.nextToken());
int b=Integer.parseInt(st.nextToken());
union(a,b);
}
int cnt=0;
for (int i = 1; i <=n; i++) {
if(parent[i]==i) {
cnt+=1;
}
}
// System.out.println("depth"+Arrays.toString(depth));
System.out.println(cnt);
}
private static int findSet(int x) {
if(parent[x]==x) {
return x;
}
return parent[x]=findSet(parent[x]);
}
private static void union(int x,int y) {
x=findSet(x);
y=findSet(y);
if(depth[x]<depth[y]) {
parent[x]=y;
depth[y]+=depth[x];
}
else {
parent[y]=x;
if(depth[x]==depth[y]) {
depth[x]++;
}else {
depth[x]+=depth[y];
}
}
}
}
728x90
반응형
'swexpert' 카테고리의 다른 글
[swexpert] 1251. 하나로 (java, 크루스칼, union-find) (0) | 2021.03.24 |
---|---|
[swexpert] 3282. 0/1 knapsack (dp, java) (0) | 2021.03.23 |
[swexpert] 3289. 서로소 집합 (java, union-find 함수) (0) | 2021.03.18 |
[swexpert] 1238. Contact (java, bfs) (0) | 2021.03.16 |
[swexpert] 7733. 치즈 도둑 (bfs, java) (0) | 2021.03.08 |
TAGS.