Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 다익스트라
- 시뮬레이션
- 01BFS
- BFS
- 재귀함수
- 게더타운시작
- 취득후기
- 다이나믹프로그래밍
- 알고리즘
- 이젠 골드구현도 어렵네..
- DFS
- 완전탐색
- PS
- GatherTown
- deque
- 백준코딩테스트
- 구현
- YBMCOS
- 네트워크플로우
- 백준
- 우선순위큐
- QUICKSTARTGUIDE
- 엘라스틱서치
- spring
- 세그먼트트리
- dp
- java
- COSPRO
- 자바PS
- COSPROJAVA1급
Archives
- Today
- Total
공부공간
BOJ - 1197 ) 최소 스패닝 트리 본문
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