๐ ๋ฌธ์
https://www.acmicpc.net/problem/1647
๋ฌธ์
๋๋ฌผ์์์ ๋ง ํ์ถํ ์์ญ์ด ํ ๋ง๋ฆฌ๊ฐ ์ธ์๊ตฌ๊ฒฝ์ ํ๊ณ ์๋ค. ๊ทธ๋ฌ๋ค๊ฐ ํํ๋ก์ด ๋ง์์ ๊ฐ๊ฒ ๋์๋๋ฐ, ๊ทธ๊ณณ์์๋ ์ ์ ์๋ ์ผ์ด ๋ฒ์ด์ง๊ณ ์์๋ค.
๋ง์์ N๊ฐ์ ์ง๊ณผ ๊ทธ ์ง๋ค์ ์ฐ๊ฒฐํ๋ M๊ฐ์ ๊ธธ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ๊ธธ์ ์ด๋ ๋ฐฉํฅ์ผ๋ก๋ ์ง ๋ค๋ ์ ์๋ ํธ๋ฆฌํ ๊ธธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ธธ๋ง๋ค ๊ธธ์ ์ ์งํ๋๋ฐ ๋๋ ์ ์ง๋น๊ฐ ์๋ค.
๋ง์์ ์ด์ฅ์ ๋ง์์ ๋ ๊ฐ์ ๋ถ๋ฆฌ๋ ๋ง์๋ก ๋ถํ ํ ๊ณํ์ ๊ฐ์ง๊ณ ์๋ค. ๋ง์์ด ๋๋ฌด ์ปค์ ํผ์์๋ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์์ ๋ถํ ํ ๋๋ ๊ฐ ๋ถ๋ฆฌ๋ ๋ง์ ์์ ์ง๋ค์ด ์๋ก ์ฐ๊ฒฐ๋๋๋ก ๋ถํ ํด์ผ ํ๋ค. ๊ฐ ๋ถ๋ฆฌ๋ ๋ง์ ์์ ์๋ ์์์ ๋ ์ง ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํด์ผ ํ๋ค๋ ๋ป์ด๋ค. ๋ง์์๋ ์ง์ด ํ๋ ์ด์ ์์ด์ผ ํ๋ค.
๊ทธ๋ ๊ฒ ๋ง์์ ์ด์ฅ์ ๊ณํ์ ์ธ์ฐ๋ค๊ฐ ๋ง์ ์์ ๊ธธ์ด ๋๋ฌด ๋ง๋ค๋ ์๊ฐ์ ํ๊ฒ ๋์๋ค. ์ผ๋จ ๋ถ๋ฆฌ๋ ๋ ๋ง์ ์ฌ์ด์ ์๋ ๊ธธ๋ค์ ํ์๊ฐ ์์ผ๋ฏ๋ก ์์จ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ถ๋ฆฌ๋ ๋ง์ ์์์๋ ์์์ ๋ ์ง ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ํญ์ ์กด์ฌํ๊ฒ ํ๋ฉด์ ๊ธธ์ ๋ ์์จ ์ ์๋ค. ๋ง์์ ์ด์ฅ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋๋ก ๊ธธ๋ค์ ๋ชจ๋ ์์ ๊ณ ๋๋จธ์ง ๊ธธ์ ์ ์ง๋น์ ํฉ์ ์ต์๋ก ํ๊ณ ์ถ๋ค. ์ด๊ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ๊ฐ์ N, ๊ธธ์ ๊ฐ์ M์ด ์ฃผ์ด์ง๋ค. N์ 2์ด์ 100,000์ดํ์ธ ์ ์์ด๊ณ , M์ 1์ด์ 1,000,000์ดํ์ธ ์ ์์ด๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ M์ค์ ๊ฑธ์ณ ๊ธธ์ ์ ๋ณด๊ฐ A B C ์ธ ๊ฐ์ ์ ์๋ก ์ฃผ์ด์ง๋๋ฐ A๋ฒ ์ง๊ณผ B๋ฒ ์ง์ ์ฐ๊ฒฐํ๋ ๊ธธ์ ์ ์ง๋น๊ฐ C (1 ≤ C ≤ 1,000)๋ผ๋ ๋ป์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ๊ณ ๋จ์ ๊ธธ ์ ์ง๋น์ ํฉ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
์ด ๋ฌธ์ ์ KeyPoint๋ ์ต์๋น์ฉ์ ์ ์งํ๋ฉฐ ๋ง์์ ๋ ๊ฐ๋ก ๋๋๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฐ๋ก >> ์ต์์ ์ฅํธ๋ฆฌ์์ ์ต๋ ๊ฐ์ค์น์ธ ๊ฐ์ ํ๋๋ฅผ ์ ๊ฑฐ <<ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ต์์ ์ฅํธ๋ฆฌ(MST)๊ฐ ์์ฑ๋์๋ค๋ฉด ์ด๋ฏธ ๋ชจ๋ ๋ ธ๋๋ค์ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ์ด๋ค. ์ด๋ ์ต๋๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ๊ฐ์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด, ํ ๊ฐ์ ๋ ธ๋๊ฐ ๋จ์ด์ ธ๋๊ฐ๋ , ๊ทธ ์ด์์ ๋ฌถ์์ด ๋จ์ด์ ธ๋๊ฐ๋ ๋ชจ๋ ๋ ธ๋๋ค์ ์ฌ์ ํ ์ฐ๊ฒฐ๋์ด์๋ ์ฑ๋ก ๋ ๊ฐ๋ก ๋๋๊ฒ ๋๋ค.
๋๋ "ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ"์ ์ฌ์ฉํ๊ณ , ์ด๋ฅผ ์ํด find()/union()ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํ๋ค. ์ด ์ฝ๋๋ ํฌ๋ฃจ์ค์นผ์ ํ ํ๋ฆฟ์ฒ๋ผ ์ฐ์ด๋ฏ๋ก ๊ทธ๋ฅ ํต์งธ๋ก ์ธ์ฐ๋ ๊ฒ์ด ์ข๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
/**
* ๋ชจ๋ ๋ง์์ ์ง๋ค์ด ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๊ณ ,
* ๊ทธ ์ฐ๊ฒฐ๋น์ฉ์ ์ต์์ธ ์ํ๋ก ๋ ๊ฐ๋ก ๋ถํ ํ๊ธฐ
* => MST์์ ์ต๋๋น์ฉ ๊ฐ์ ํ๋๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋๋ค.
*/
public class Main_๋ฐฑ์ค_1647_๋์๋ถํ ๊ณํ_๊ณจ๋IV {
static int N, M;
static PriorityQueue<int[]> queue;
static int[] parents;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
queue = new PriorityQueue<>((a,b)->(a[0]-b[0]));//๊ฐ์ค์น ์ฐ์ ์์
parents = new int[N+1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
queue.offer(new int[] {w, v1, v2});
}//input
for (int i = 1; i <= N; i++) {
parents[i] = i;
}//make
System.out.println(kruskal());
}//end of main
private static int kruskal() {
int result = 0;
int max = Integer.MIN_VALUE;
while(queue.size()>0) {
int[] edge = queue.poll();
int w = edge[0];
int v1 = edge[1];
int v2 = edge[2];
if(union(v1,v2)) {
result+=w;
max = Math.max(max, w);
}
}
return result-max;
}//kruskal
private static int find(int v) {
if(parents[v]==v) return v;
return parents[v]=find(parents[v]);
}//find
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;
}//union
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ