https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV_mSnmKUckDFAWb
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Solution_3124_유동훈 {
static class Edge implements Comparable<Edge>
{
int from,to,weight;
public Edge(int from, int to, int weight) {
super();
this.from = from;
this.to = to;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return this.weight-o.weight;
}
//싼거부터 나오게 정렬
}
static int[] parents;
static int V,E;
static Edge[] edgeList;
/**
* 크기가 1인 서로조 집합 생성
* 모든 노드가 자신을 부모로 하는 집합으로 만들기
*/
static void make()
{
parents=new int[V+1];
for(int i=0;i<=V;++i)
{
parents[i]=i;
}
}
/**
* x의 대표자 찾기
* @param x
* @return
*/
public static int find(int x) {
//x의 부모== x->내가 루트임.
if (parents[x] == x)
{
return x;
}
//아니면 내 부모의 부모를 찾아라
//반복
//else
{
return parents[x]=find(parents[x]);
//우리의 대표자를 나의 부모로 : path compression
}
}
/**
*
* @param a
* @param b
* (A를 B에 연결)
* A의 루트노드를 B의 루트노드에 연결
* (A위에 B를 부모로)
*
* @return 유니언 성공시 true
*/
public static boolean union(int a, int b) {
int rootA = find(a);
int rootB = find(b);
if (rootA == rootB) return false;
//B의 루트노드를 A의 루트노드에 연결
parents[rootB] = rootA;
return true;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T=Integer.parseInt(br.readLine());
for(int t=1;t<=T;++t)
{
StringTokenizer st=new StringTokenizer(br.readLine());
V=Integer.parseInt(st.nextToken()); //정점수
E=Integer.parseInt(st.nextToken()); //간선수
edgeList=new Edge[E];
for(int i=0;i<E;++i)
{
st= new StringTokenizer(br.readLine());
edgeList[i]=new Edge(Integer.parseInt(st.nextToken())
,Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()));
}
//입력끝!
make();
//1. 정렬
Arrays.sort(edgeList);
long result=0L; //최소 가중치==정답
int count=0;
//2.정렬되있음 -> 앞부터 연결하면됨
for(Edge edge:edgeList)
{
if(union(edge.from,edge.to))
{
result=result+edge.weight;
//모두연결되면 끝내기
if(++count==V-1)
{
break;
}
}
}
System.out.println("#"+t+" "+result);
}
}
}
'Algorithm > swea' 카테고리의 다른 글
swea 3289 서로소 집합 (0) | 2022.08.24 |
---|---|
swea 7465 창용 마을 무리의 개수 //유니언 파인드, 버퍼드라이터 (0) | 2022.08.23 |
1247. [S/W 문제해결 응용] 3일차 - 최적 경로 (0) | 2022.08.19 |
3234. 준환이의 양팔저울 (0) | 2022.08.19 |
5644. [모의 SW 역량테스트] 무선 충전 (0) | 2022.08.17 |