공부공간

BOJ - 1197 ) 최소 스패닝 트리 본문

알고리즘/구현,시뮬

BOJ - 1197 ) 최소 스패닝 트리

개발자가될수있을까? 2020. 4. 9. 22:24

 


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

 

1197번: 최소 스패닝 트리

첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 가중치 C인 간선으로 연결되어 있다는 의미이다. C는 음수일 수도 있으며, 절댓값이 1,000,000을 넘지 않는다. 그래프의 정점은 1번부터 V번까지 번호가 매겨져 있고, 임의의 두 정점 사이에 경로가 있다. 최소 스패닝

www.acmicpc.net


MST를 구현하는 알고리즘에는 3가지가 있다.

1. Prim Algorithm

2. Kruskal Algorithm 

3. Sollin Algorithm

 

보통 1,2 번이 구현이 쉬워 많이 사용한다. 

위문제는 인접리스트로, 노드의 정보를 생성해 MST 를 구하는 문제이다.

 


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	public static int[] parent;
	public static void make(int v) {
		for(int i  = 1 ; i <= v; i++) {
			parent[i]=i;
		}
	}
	public static int find(int x) {
		if(parent[x]==x) return x;
		else return find(parent[x]);
	}
	public static void union(int a, int b) {
		int pa = find(a);
		int pb = find(b);
		if(pa == pb) return ;
		if(pa > pb ) parent[pb] = pa;
		else parent[pa] = pb;
	}
	public static class node{
		int s , e , w ;

		public node(int s, int e, int w) {
			this.s = s;
			this.e = e;
			this.w = w;
		}
		
	}
	
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int v =Integer.parseInt(st.nextToken());
		int e =Integer.parseInt(st.nextToken());
		
		parent = new int[v+1]; 
		make(v);
		
		node map[] = new node[e];
		for(int i = 0 ; i < e; i++) {
			st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());
			int weight = Integer.parseInt(st.nextToken());
			map[i] = new node(start, end, weight);
		}
		
		Arrays.sort(map , new Comparator<node>() {
			@Override
			public int compare(node o1, node o2) {
				if(o1.w > o2.w) return 1;
				else if( o1.w < o2.w) return -1;
				else return 0;
			}
		});
		
		long answer= 0;
		for( int index=0 ; index < map.length; index++) {
			int pa = find(map[index].s);
			int pb = find(map[index].e);
			if(pa==pb) continue;
			union(pa, pb);
			answer +=map[index].w;
		}
		System.out.println(answer);
	}
}

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

BOJ - 2003 ) 수들의 합 2  (0) 2020.05.11
프로그래머스 ) 지형이동  (1) 2020.04.29
BOJ - 1717 ) 집합의 표현  (0) 2020.03.22
BOJ - 14891 ) 톱니바퀴  (0) 2020.03.08
BOJ - 3190 ) 뱀  (0) 2020.03.07
Comments