https://www.acmicpc.net/problem/23743
23743๋ฒ: ๋ฐฉํ์ถ
์ฒซ ๋ฒ์งธ ์ค์๋ ๋ฐฉ์ ๊ฐ์ $N$๊ณผ ์ค์นํ ์ ์๋ ์ํ์ ๊ฐ์ $M$์ด ์ฃผ์ด์ง๋ค. ($2 \le N \le 200\,000$, $1 \le M \le 100\,000$) ๋ค์ $M$๊ฐ์ ์ค์๋ ์ํ์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ธ ์ ์ $a_i$, $b_i$, $c_i$๊ฐ ๊ณต๋ฐฑ์ผ
www.acmicpc.net
๋ฌธ์
- 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ์ด N๊ฐ์ ๋ฐฉ
- ๊ฐ ๋ฐฉ์๋ ์น๊ตฌ๋ค์ด ํ ๋ช ์ฉ ๋ค์ด๊ฐ ์๊ณ , ๋ชจ๋ ๋ฐฉ์ ์ธ๋ถ๋ก๋ถํฐ ์์ ํ ๋ ๋ฆฝ๋์์
- ์ํ : ์ต๋ M๊ฐ, i๋ฒ์งธ ์ํ ์ค์นํ๋ ๋ฐ Ci ์๊ฐ, ai๋ฒ๊ณผ bi๋ฒ ๋ฐฉ ์ฌ์ด ์ด๋
- ๋น์ํ์ถ๊ตฌ : i๋ฒ ๋ฐฉ์ ์ค์นํ๋ ๋ฐ ti ์๊ฐ
- ๋น์ํ์ถ๊ตฌ์ ์ค์น ์์ ์ ๋์์ ์ฌ๋ฟ ์งํํ ์ ์์
- ๋ชจ๋ ์น๊ตฌ๋ค์ด ์ถ๊ตฌ๋ก ํ์ถํ ์ ์๋๋ก ์ํ์ ๋น์ํ์ถ๊ตฌ๋ฅผ ์ค์นํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์ต์ ์๊ฐ ๊ตฌํ๊ธฐ
์์ ์ ์ถ๋ ฅ
3 3
1 2 2
2 3 2
3 1 2
3 3 3
๊ฒฐ๊ณผ : 7
ํ์ด
- ํ์ถ๊ตฌ๋ฅผ 0๋ฒ๋ฐฉ์ผ๋ก ๊ฐ์ฃผํ๋ค (ํ์ถ๊ตฌ๋ก ๊ฐ๋ ๊ธธ๋ ํ๋์ ๊ฐ์ ์ด๋ค)
- MST(์ต์ ์คํจ๋ ํธ๋ฆฌ) ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ธ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ ์ ๋ณด(์ ์ 1, ์ ์ 2, ๋น์ฉ) ์ ์ฅ → ๋น์ฉ ๋ฎ์ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
- ๋ฎ์ ๋น์ฉ๋ถํฐ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๊ฒ ์ ํ
- union, find ์ํ
- union : ๋ถ๋ชจ๊ฐ ๊ฐ์์ง ํ์ธ(์ฌ์ดํด์ธ์ง) → ๋ค๋ฅด๋ฉด ๋ถ๋ชจ ๊ฐฑ์ (์ฐ๊ฒฐ)
- find : ํด๋น ์ ์ ์ ๋ถ๋ชจ ์ฐพ๊ธฐ
- (์ ์ ๊ฐ์ - 1) ๋งํผ ์ ํํ์ผ๋ฉด ์ข ๋ฃ
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class b23743 {
static int N, M;
static Edge[] edgeList;
static int[] parents;
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 this.weight - o.weight;
}
}
static void make() {
parents = new int[N + 1];
for(int i = 0; i < N + 1; i++) {
parents[i] = i;
}
}
static int find(int a) {
if(parents[a] == a) return a;
return parents[a] = find(parents[a]);
}
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;
}
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()); //์ค์นํ ์ ์๋ ์ํ์ ๊ฐ์
edgeList = new Edge[M + N]; //๊ฐ์ ๋ฐฐ์ด
//์ํ ์ฐ๊ฒฐ
for(int i = 0; i < M; i ++) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
edgeList[i] = new Edge(a, b, c);
}
//ํ์ถ๊ตฌ ์ค์น
st = new StringTokenizer(br.readLine(), " ");
for(int i = 1; i <= N; i ++) {
int t = Integer.parseInt(st.nextToken());
edgeList[M + i - 1] = new Edge(0, i, t); //ํ์ถ๊ตฌ๋ 0
}
//์ฒ๋ฆฌ
make(); //๋ถ๋ชจ ๋
ธ๋ ๋ง๋ค๊ธฐ
Arrays.sort(edgeList); //์๊ฐ ๋ฎ์ ์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
//ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ
int result = 0;
int count = 0;
for(Edge edge : edgeList) { //๋ฎ์ ๋น์ฉ๋ถํฐ ์ฐ๊ฒฐ
if(union(edge.from, edge.to)) { //์ฌ์ดํด์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๊ฐ์ ์ ํ
result += edge.weight; //๋น์ฉ ๊ฐฑ์
if(++count == N) break; //์ ์ ๊ฐ์ - 1 ๋งํผ ์ ํํ์ผ๋ฉด ์ข
๋ฃ : N + 1(ํ์ถ๊ตฌ ํฌํจ) - 1
}
}
//์ถ๋ ฅ
System.out.println(result);
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
- ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋๋ง์ ๊ณต๋ถํ๋ค
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 13459๋ฒ : ๊ตฌ์ฌ ํ์ถ (0) | 2023.08.02 |
---|---|
๋ฐฑ์ค 1863๋ฒ : ์ค์นด์ด๋ผ์ธ ์ฌ์ด๊ฑฐ (0) | 2023.07.26 |
๋ฐฑ์ค 17069๋ฒ - ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 (0) | 2022.10.05 |
๋ฐฑ์ค 9205๋ฒ - ๋งฅ์ฃผ ๋ง์๋ฉด์ ๊ฑธ์ด๊ฐ๊ธฐ (0) | 2022.10.02 |
๋ฐฑ์ค 1189๋ฒ - ์ปด๋ฐฑํ (0) | 2022.10.01 |