์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- ํ๋ก์ด๋์์
- til
- tcp ํ๋กํ ์ฝ
- leetcode
- git merge
- ์ฝ๋ฉํ ์คํธ์ค๋น
- ํญํด99
- reducible
- mariadb
- ๋น์ฃผ๊ธฐ์ ํธ
- ์ฃผ๊ธฐ์ ํธ
- ๋ฐ์ดํฐ ์ ์ก
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- xv6
- ์์๋ฒํธ
- ์ค๋ธ์
- ์ค๋ ๋
- well known ํฌํธ
- ํ๋ ์ ๊ตฌ์กฐ
- ์ฐ๋ถํฌdb
- i-type
- ํ ํฐ ๋ฒ์ค
- ์๋น์ค ํ๋ฆฌ๋ฏธํฐ๋ธ
- ์ค๋ฅ์ ์ด
- IEEE 802
- ๊ฐ๋ฐ์์ทจ์
- 99ํด๋ฝ
- ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- tcp ์ธ๊ทธ๋จผํธ
- ์ค๋ฅ๊ฒ์ถ
- Today
- Total
Unfazedโ๏ธ๐ฏ
[Java] ๋๋น ์ฐ์ ํ์ BFS| ๋ฐฑ์ค 1240 ๋ ธ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ ๋ณธ๋ฌธ
[Java] ๋๋น ์ฐ์ ํ์ BFS| ๋ฐฑ์ค 1240 ๋ ธ๋์ฌ์ด์ ๊ฑฐ๋ฆฌ
9taetae9 2024. 11. 4. 09:23https://www.acmicpc.net/problem/1240
์ด ๋ฌธ์ ๋ ํธ๋ฆฌ์์ ๋ ๋ ธ๋ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก, BFS(๋๋น ์ฐ์ ํ์)๋ฅผ ํ์ฉํ์ฌ ํด๊ฒฐํ ์ ์์๋ค.
์ ๊ทผ ๋ฐฉ์
- ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ๋ฅผ ํํ
- ์๋ฐฉํฅ ๊ฐ์ ์ผ๋ก ์ฒ๋ฆฌ (ํธ๋ฆฌ๋ ์์ชฝ์ผ๋ก ์ด๋ ๊ฐ๋ฅ)
- Edge ํด๋์ค๋ฅผ ์ ์ํ์ฌ ๋ชฉ์ ์ง ๋ ธ๋์ ๊ฐ์ค์น ์ ๋ณด๋ฅผ ํจ๊ป ์ ์ฅ
static class Edge {
int to;
int weight;
public Edge(int to, int weight) {
this.to = to;
this.weight = weight;
}
}
BFS๋ฅผ ์ด์ฉํ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
- ์์ ๋ ธ๋๋ถํฐ BFS๋ฅผ ์ํํ์ฌ ๊ฐ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐ
- distance ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ฐ ๋ ธ๋๊น์ง์ ๋์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅ
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ -1๋ก ํ์ => ๋ณ๋ visited ๋ฐฐ์ด์ ๋ง๋ค์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
static private int getDistance(int start, int end) {
int[] distance = new int[N];
Arrays.fill(distance, -1);
distance[start] = 0;
Queue<Integer> queue = new LinkedList<>();
queue.offer(start);
while (!queue.isEmpty()) {
int currentNode = queue.poll();
if (currentNode == end) {
return distance[currentNode];
}
for (Edge e : graph[currentNode]) {
if (distance[e.to] == -1) {
distance[e.to] = distance[currentNode] + e.weight;
queue.offer(e.to);
}
}
}
return distance[end];
}
main ์ฝ๋
static int N, M;
static ArrayList<Edge>[] graph;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
graph = new ArrayList[N];
for (int i = 0; i < graph.length; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < N - 1; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken()) - 1;
int v2 = Integer.parseInt(st.nextToken()) - 1;
int weight = Integer.parseInt(st.nextToken());
graph[v1].add(new Edge(v2, weight));
graph[v2].add(new Edge(v1, weight));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken()) - 1;
int v2 = Integer.parseInt(st.nextToken()) - 1;
sb.append(getDistance(v1, v2)).append("\n");
}
System.out.print(sb);
}
์๊ฐ ๋ณต์ก๋
๊ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋๋ฐ O(N)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฌ๊ณ ๊ฐ ๊ฐ์ ์ ๋ฐฉ๋ฌธํ๋๋ฐ O(E)์ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฐ๋ค.
์ด ๋ฌธ์ ์์๋ E = N-1 ์ด๋ฏ๋ก O(N + E) = O(N + (N-1)) = O(N)๋ก ์๊ฐ ๋ณต์ก๋๋ O(N)์ด ๋๋ค.
์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ M๋ฒ์ ๊ฑฐ๋ฆฌ๊ตฌํ๋ ์์ฒญ์ด ์์ผ๋ฏ๋ก O(M * (N+E))=O(M * N) ์ด๋ค.
์ด ๋ฌธ์ ๋ฅผ ํตํด BFS์ ํ์ฉ๊ณผ ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ์ ๋ค์ ๋ณต์ตํด๋ณผ ์ ์์๊ณ , ๋ค๋ง ์ฟผ๋ฆฌ ์๊ฐ ๋ ๋ง์ ๊ฒฝ์ฐ์๋ ๋ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ ๊ฒ ๊ฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ LCA ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ํ์ดํ์๋ค. ์ด๋ฅผ ์ถํ ํ์ตํ๊ณ ์ ๋ฆฌํด๋ณด์์ผ๊ฒ ๋ค.
'๋ฌธ์ ํด๊ฒฐ (PS) > ์ฝํ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ํฌํฌ์ธํฐ | ๋ฐฑ์ค 1253 ์ข๋ค (0) | 2024.11.07 |
---|---|
[Java] ํธ๋ฆฌ, ๊ตฌํ | ํ๋ก๊ทธ๋๋จธ์ค ๋ค๋จ๊ณ ์นซ์ ํ๋งค (0) | 2024.11.06 |
[Java] ํ๋ก์ด๋-์์ , DFS | ๋ฐฑ์ค 2458 ํค ์์ (0) | 2024.11.03 |
[Java] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ | ๋ฐฑ์ค 2457 ๊ณต์ฃผ๋์ ์ ์ (0) | 2024.11.02 |
[Java] ๋ฒจ๋ง-ํฌ๋ | ๋ฐฑ์ค 1865 ์ํ (0) | 2024.11.01 |