<Algorithm> 48. 1717번 집합의 표현
by BFine반응형
1. 1717번 집합의 표현
기본 UnionFind 문제 , UnionFind는 어떤 노드가 있을 때 루트의 크기를 비교해서 하나의 집합으로 만들어 주는 알고리즘이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws NumberFormatException, IOException { ArrayList<String> ans =new ArrayList<>(); BufferedReader br =new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer.parseInt(st.nextToken()); int M = Integer.parseInt(st.nextToken()); Node[] node = new Node[N + 1]; for(int i = 0 ; i < N + 1; i++) { node[i] = new Node(i,0); }// 최초의 부모는 자기자신 Union u = new Union(node); for(int j = 0; j < M; j++) { st = new StringTokenizer(br.readLine()); int z = Integer.parseInt(st.nextToken()); int a = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); if(z == 0) { u.uni(a,b); }else { if(u.check(a, b)) { ans.add("yes"); }else { ans.add("no"); } } } for(String str : ans) { System.out.println(str); } } } class Union{ Node[] node; public Union(Node[] node) { this.node = node; } public int find(int i) { if(node[i].parent != i) { return find(node[i].parent); // return 하지않으면 런타임 오류 발생 } return node[i].parent; } public void uni(int i, int j) { int iroot = find(i); int jroot = find(j); if(iroot == jroot) return; // 같은 집합에 있다 if(node[iroot].rank > node[jroot].rank) { node[jroot].parent = iroot; // j를 i에 병합 }else if(node[iroot].rank < node[jroot].rank) { node[iroot].parent = jroot; }else { node[jroot].parent = iroot; node[iroot].rank += 1; } // 같을 경우 아무거나 붙여주고 rank( 노드의 깊이를 하나 추가 한다 ) } public boolean check(int i, int j) { int iroot = find(i); int jroot = find(j); if(iroot == jroot) return true; return false; } // 같은 집합에 있는지 확인 } class Node{ int parent,rank; public Node(int parent, int rank) { super(); this.parent = parent; this.rank = rank; } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 50. 1916번 최소비용 구하기(Dijkstra) (0) | 2018.08.13 |
---|---|
<Algorithm> 49. 1197번 최소 스패닝 트리(Kruskal & prim) (0) | 2018.08.12 |
<Algorithm> 47. 2748번 피보나치2 (0) | 2018.08.11 |
<Algorithm> 46. 2252번 줄세우기 (0) | 2018.08.11 |
<Algorithm> 45. 14502번 연구소 (0) | 2018.08.10 |
블로그의 정보
57개월 BackEnd
BFine