๐ ๋ฌธ์
https://www.acmicpc.net/problem/1197
๋ฌธ์
๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ๊ทธ๋ํ์ ์ต์ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ต์ ์คํจ๋ ํธ๋ฆฌ๋, ์ฃผ์ด์ง ๊ทธ๋ํ์ ๋ชจ๋ ์ ์ ๋ค์ ์ฐ๊ฒฐํ๋ ๋ถ๋ถ ๊ทธ๋ํ ์ค์์ ๊ทธ ๊ฐ์ค์น์ ํฉ์ด ์ต์์ธ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ V(1 ≤ V ≤ 10,000)์ ๊ฐ์ ์ ๊ฐ์ E(1 ≤ E ≤ 100,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ E๊ฐ์ ์ค์๋ ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ A๋ฒ ์ ์ ๊ณผ B๋ฒ ์ ์ ์ด ๊ฐ์ค์น C์ธ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ค. C๋ ์์์ผ ์๋ ์์ผ๋ฉฐ, ์ ๋๊ฐ์ด 1,000,000์ ๋์ง ์๋๋ค.
๊ทธ๋ํ์ ์ ์ ์ 1๋ฒ๋ถํฐ V๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๊ณ , ์์์ ๋ ์ ์ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ์๋ค. ์ต์ ์คํจ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๊ฐ -2,147,483,648๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 2,147,483,647๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต์ ์คํจ๋ ํธ๋ฆฌ์ ๊ฐ์ค์น๋ฅผ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ต์์ ์ฅํธ๋ฆฌ์ ๊ฐ๋ ์ ๋ค์ ๋ค์ง์ ํด์ ๊ณ ๋ฅธ ๋ฌธ์ ์ธ๋ฐ, ๋งค๋ฒ ํ๋ ๋ฐฉ์๋๋ก ํ์๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ํ๋ฆผ์ ๋์ฒด ์ธ์ ์ธ๊ฑด์ง....?
๐ก ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ: ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ๋ถํฐ ๊ณจ๋ผ ๋ ธ๋๋ฅผ ํฉ์ณ๊ฐ๋ฉฐ ์ต์์ ์ฅํธ๋ฆฌ(MST)๋ฅผ ๋ง๋ค์ด๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ
๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ ์ ๊ณ ๋ฅด๋ ์ผ์ ์ฐ์ ์์ํ๋ก ๊ตฌํํ๋ค. ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ์ผ์ ๋งค๋ฒ ํ๋ ๋๋ก Disjoint Set ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_1197_์ต์์คํจ๋ํธ๋ฆฌ_๊ณจ๋IV {
static int[][] graph;
static int[] parents;
static int V, E, result=0;
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());
parents = new int[V+1];
// ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ ํ ์์ฑ
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2]-o2[2]; //์ค๋ฆ์ฐจ์
}
});
for (int i = 0; i < E; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
queue.offer(new int[] {v1, v2, e});
}
make(); //๋ฃจํธ๋
ธ๋ ์์ฑ
while(queue.size()>0) {
int[] cur = queue.poll(); //๊ฐ์ค์น๊ฐ ์ ์ผ ์์ ์์ผ๋ก
if(union(cur[0], cur[1])) {
result+=cur[2];
}
}
System.out.println(result);
}//end of main
private static boolean union(int v1, int v2) {
int root1 = find(v1);
int root2 = find(v2);
if(root1==root2) return false;
parents[root1] = root2;
return true;
}//end of union
private static int find(int v) {
if(parents[v]==v) return v;
return parents[v] = find(parents[v]);
}//end of find
private static void make() {
for (int i = 1; i <=V; i++) {
parents[i] = i;
}
}//end of make
}//end of main
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ