백준 1197번: 최소 스패닝 트리 [JAVA]

2023. 3. 27. 02:48·개발/코딩테스트

https://www.acmicpc.net/problem/1197

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이

www.acmicpc.net

  • 풀이

최소 신장 트리는 크루스칼 알고리즘과 프림 알고리즘으로 해결할 수 있다.

나는 그 중 크루스칼 알고리즘을 풀었다.

Edge 클래스를 만들어 각 간선의 정점, 가중치 값을 담고 가중치 오름차순으로 정렬했다.

가중치가 작은 것부터 시작해서 간선이 잇는 두 정점이 같은 그룹이 아니라면 선택하는 방식이다. 두 정점이 이미 같은 그룹이라면 다시 선택했을 때 사이클이 형성되기 때문이다.

두 정점이 같은 그룹인 지 확인하기 위해 부모를 찾는 Find 함수를 사용하였고, 간선이 선택되었을 때 같은 그룹으로 만들어주기 위해 부모를 합치는 Union 함수를 사용하였다.

  • 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static int V, E;
	static int parent[];
	static Edge edges[];
	static int weight;
	
	static class Edge{
		int u, v, c;
		Edge(int u, int v, int c){
			this.u = u;
			this.v = v;
			this.c = c;
		}
	}
	
	// 같은 그룹인 지 확인
	static int find(int x) {
		if (parent[x] == x) return x;
		return parent[x] = find(parent[x]);
	}
	
	// 같은 그룹으로 합치기
	static void union(int x, int y) {
		x = parent[x];
		y = parent[y];
		
		if (x>y) parent[x] = y;
		else parent[y] = x;
	}
	

	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		V = Integer.parseInt(st.nextToken());
		E = Integer.parseInt(st.nextToken());

		parent = new int[V+1];
		edges = new Edge[E];
		
	  // 부모 배열 초기화
		for (int i=1; i<V+1; i++) parent[i] = i;
		
		// 간선 정보 입력
		for (int i=0; i<E; i++) {
			st = new StringTokenizer(bf.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			edges[i] = new Edge(u, v, c);
		}
		
		// 가중치 오름차순 정렬
		Arrays.sort(edges, (o1, o2) -> (o1.c - o2.c));
		
		// 크루스칼 알고리즘
		for (int i=0; i<E; i++) {
			Edge now = edges[i];
			if (find(now.u) == find(now.v)) continue;
			weight += now.c;
			union (now.u, now.v);
		}

		// 출력
		System.out.println(weight);
	}

}
'개발/코딩테스트' 카테고리의 다른 글
  • 백준 14621번: 나만 안 되는 연애 [JAVA]
  • 백준 1325번: 효율적인 해킹 [JAVA]
  • 백준 1717번: 집합의 표현 [JAVA]
  • 백준 1976번: 여행 가자 [JAVA]
로또
로또
게임 개발자 연습생의 발전 일지
  • 로또
    게임 개발 발전소
    로또
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 개발
        • 코딩테스트
        • JAVA
        • DB
        • Unity
      • 강의 N
        • 패스트캠퍼스 0원 챌린지
        • 멋쟁이 사자처럼 유니티 부트캠프 N
      • 게임 N
        • 리뷰 N
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    BFS
    멋쟁이사자처럼후기
    분리집합
    dfs
    패스트캠퍼스
    직장인인강
    C4D
    직장인자기계발
    Java
    패스트캠퍼스후기
    오공완
    2839
    설탕배달
    최소신장트리
    수강료0원챌린지
    환급챌린지
    패캠인강후기
    부분집합
    트리
    한번에끝내는프론트엔드개발초격차패키지Online
    백트래킹
    코딩테스트
    3D웹인터랙티브
    그리디알고리즘
    완전탐색
    자료구조
    그리디
    그래프
    백준
    패캠챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
로또
백준 1197번: 최소 스패닝 트리 [JAVA]
상단으로

티스토리툴바