https://www.acmicpc.net/problem/14621
14621번: 나만 안되는 연애
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의
www.acmicpc.net
코드설명
최소신장트리(Minimum Spanning Tree, MST) + 크루스칼(Kruskal) 문제에 약간의 로직이 추가되었습니다.
1. Node의 상태에 따라서 UnionParent를 할지말지 결정합니다.
- 학교가 남초대학교(M)인지, 여초대학교(W)인지를 Node에 저장해서 가지고 있다가
만약 서로 연결된 관계가 M-W 일 경우에만 unionParent를 해주는 로직을 수행하면 됩니다.
2. 최소 신장 트리의 연결된 간선의 개수는 무조건 N - 1 입니다.
코드
package algorhythm; import java.util.*; public class Main { public static int[] parent = new int[1001]; public static ArrayList<Node> nodes = new ArrayList<>(); public static ArrayList<Edge> edges = new ArrayList<>(); public static int N, M, result=0, cnt = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); for(int i=1;i<=N;i++) { parent[i] = i; } for(int i=0;i<N;i++) { char gender = sc.next().charAt(0); nodes.add(new Node(gender)); // System.out.println("gender"+ gender); } for(int i=0;i<M;i++) { int a = sc.nextInt(); int b = sc.nextInt(); int cost = sc.nextInt(); edges.add(new Edge(a, b, cost)); } Collections.sort(edges); for(int i=0;i<edges.size();i++) { int a = edges.get(i).nodeA; int b = edges.get(i).nodeB; int cost = edges.get(i).distance; if(findParent(a) != findParent(b)) { if( nodes.get(a-1).gender != nodes.get(b-1).gender ) { unionParent(a, b); result += cost; cnt+=1; } } } if(cnt == N-1) System.out.println(result); else System.out.println("-1"); } public static int findParent(int x) { if( x == parent[x]) return x; return parent[x] = findParent(parent[x]); } public static void unionParent(int a, int b) { a = findParent(a); b = findParent(b); if( a < b ) parent[b] = a; else parent[a] = b; } } class Node{ char gender; public Node(char gender) { this.gender = gender; } } class Edge implements Comparable<Edge>{ int nodeA; int nodeB; int distance; public Edge(int nodeA, int nodeB, int distance) { this.nodeA = nodeA; this.nodeB = nodeB; this.distance = distance; } //거리가 짧은 순으로 정렬하도록 합니다. @Override public int compareTo(Edge other) { if(this.distance > other.distance) { return 1; }else if(this.distance < other.distance) { return -1; }else { return 0; } } }