๐์ต์์ ์ฅํธ๋ฆฌ
์ต์์ ์ฅํธ๋ฆฌ๋ 1)๋ชจ๋ ์ ์ ์ ํฌํจํ๋ฉด์ 2)๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ต์์ ์ฅํธ๋ฆฌ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ ์ค ๋ํ์ ์ผ๋ก๋ Kruskal ์๊ณ ๋ฆฌ์ฆ๊ณผ Prim ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
๐Kruskal ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ ์ค์ฌ → edgeList๊ฐ ํ์
1. ์ต์ด ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
2. ๊ฐ์ค์น๊ฐ ๋ฎ์ ๊ฐ์ ๋ถํฐ ์ ํํ๋ฉด์ ํธ๋ฆฌ๋ฅผ ์ฆ๊ฐ์ํจ๋ค. ์ด๋, ์ฌ์ดํด์ด ์กด์ฌํ๋ฉด ๋จ์ ์๋ ๊ฐ์ ์ค ๊ทธ ๋ค์์ผ๋ก ๊ฐ์ค์น๊ฐ ๋ฎ์ ์ ํ
=>N-1๊ฐ์ ๊ฐ์ ์ด ์ ํ๋ ๋๊น์ง 2๋ฐ๋ณต
*์๋ก์ ์งํฉ(Disjoint-set)์ ์ด์ฉํ Kruskal ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
์๋ก์ ์งํฉ(Disjoint-set)์ ์ค๋ณต ํฌํจ๋ ์์๊ฐ ์๋ ์งํฉ์ ์๋ฏธํ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
//๋ฉ๋ชจ๋ฆฌ:49648KB, ์๊ฐ:632ms
public class Main_1197_G4_์ต์์คํจ๋ํธ๋ฆฌ_KRUSKAL_์กฐ์์ {
static int V; //์ ์ ์ ๊ฐ์
static int E; //๊ฐ์ ์ ๊ฐ์
static Edge[] edgeList; //๊ฐ์ ๋ฆฌ์คํธ
///์๋ก์์งํฉ/////////////////////
static int[] parents; //์๋ก์ ์งํฉ
public static void make() {
parents = new int[V+1];
for(int i=1;i<V+1;i++){
parents[i] = i;
}
}
public static int find(int a){
if(a==parents[a]) return a;
return parents[a]=find(parents[a]);
}
public static boolean union(int a, int b){
int aRoot = find(a);
int bRoot = find(b);
if(aRoot==bRoot) return false; //ํธ๋ฆฌ๋ฅผ ํฉ์น ์ ์์
parents[bRoot] = aRoot;
return true;
}
///////////////////////////////
static class Edge implements Comparable<Edge>{
int from,to,weight;
public Edge(int from, int to, int weight){
this.from = from;
this.to = to;
this.weight = weight;
}
@Override
public int compareTo(Edge o) {
return Integer.compare(this.weight, o.weight);
}
}
public static int MSTKruskal(){
make();
Arrays.sort(edgeList);
int result = 0;
int cnt = 0;
for(Edge edge : edgeList){
if(!union(edge.from,edge.to)) continue;
result += edge.weight;
if(++cnt==V-1) break; //์ต์ ์ ์ฅ ํธ๋ฆฌ ์์ฑ
}
return cnt==V-1?result:-1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
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());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
edgeList[i]=new Edge(from,to,weight);
}
System.out.println(MSTKruskal());
}
}
๐ Prim ์๊ณ ๋ฆฌ์ฆ
์ ์ ์ค์ฌ → visited[]์ ์ด์ฉํด์ ์ ์ ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ check
1. ์์ ์ ์ ์ ํ๋ ์ ํํด์ ์์
2. ์ ํํ ์ ์ ๊ณผ ์ธ์ ํ๋ ์ ์ ๋ค ์ค ์ต์ ๋น์ฉ์ ๊ฐ์ ์ด ์กด์ฌํ๋ ์ ์ ์ ์ ํ
=>๋ชจ๋ ์ ์ ์ด ์ ํ๋ ๋๊น์ง 2๊ณผ์ ์ ๋ฐ๋ณต
*์ธ์ ํ๋ ฌ(adjMatrix)์ ์ด์ฉํ Prim ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_1197_G4_์ต์์คํจ๋ํธ๋ฆฌ_PRIM_์กฐ์์ {
static int V; //์ ์ ์ ๊ฐ์
static int E; //๊ฐ์ ์ ๊ฐ์
static int[][] adjMatrix; //์ธ์ ํ๋ ฌ
static boolean[] visited; //์ ์ ๋ฐฉ๋ฌธ์ฌ๋ถ check
static int[] minEdge;
public static int MSTPrim(){
visited = new boolean[V+1];
minEdge = new int[V+1];
Arrays.fill(minEdge,Integer.MAX_VALUE);
int result = 0;
minEdge[1]=0;
int c=0;
for(c=0;c<V-1;c++){
int min = Integer.MAX_VALUE;
int minVertex = -1;
for(int i=1;i<V+1;i++){
if(!visited[i] && minEdge[i]<min){
min=minEdge[i];
minVertex=-1;
}
}
if(minVertex==-1) break; //ํธ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๋ ๊ฒฝ์ฐ
result+=min;
visited[minVertex]=true;
for(int i=1;i<V+1;i++){
if(!visited[i] && adjMatrix[minVertex][i]!=0
&&adjMatrix[minVertex][i]<minEdge[i]){
minEdge[i]=adjMatrix[minVertex][i];
}
}
}
return c==V-1 ? result : -1;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
V = Integer.parseInt(st.nextToken());
E = Integer.parseInt(st.nextToken());
adjMatrix = new int[V+1][V+1];
for(int i=0;i<E;i++){
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
adjMatrix[from][to] = weight;
}
System.out.println(MSTPrim());
}
}
๊ทธ๋ฐ๋ฐ ์ธ์ ํ๋ ฌ๋ก ๊ทธ๋ํ๋ฅผ ๊ตฌํ๋ ๊ฒฝ์ฐ ์ธ์ ํ๋ ฌ ์์ฒด๊ฐ
⇒ ๊ฐ์ ์ด ์ ์ ํฌ์ํ๋ ฌ์ธ ๊ฒฝ์ฐ์๋ Kruskal ์๊ณ ๋ฆฌ์ฆ์ด, ๊ฐ์ ์ด ๋ง์ ๋ฐ์งํ๋ ฌ์ธ ๊ฒฝ์ฐ์๋ Prim ์๊ณ ๋ฆฌ์ฆ์ด ์ ๋ฆฌํ๋ค.
*๋ฐฑ์ค: ์ต์ ์คํจ๋ ํธ๋ฆฌ
https://www.acmicpc.net/problem/1197
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค]๋ฉ๋ด ๋ฆฌ๋ด์ผ-java (0) | 2024.11.21 |
---|---|
[์๊ณ ๋ฆฌ์ฆ]์์ด, ์กฐํฉ, ๋ถ๋ถ์งํฉ - Java๋ก ๊ตฌํํ๊ธฐ (1) | 2024.02.24 |
[์๊ณ ๋ฆฌ์ฆ]DynamicProgramming (0) | 2022.04.23 |
[์๊ณ ๋ฆฌ์ฆ]Sorting Algorithm_RadixSort (0) | 2022.04.23 |
[์๊ณ ๋ฆฌ์ฆ]Sorting Algorithm_HeapSort (0) | 2022.04.23 |