- Today
- Total
- OOP
- ์๋ฐ
- array
- CS
- pytorch
- BFS
- ๊ตฌํ
- ์กธ์ ์ํ
- ๊ทธ๋ฆฌ๋
- Algorithm
- PS
- ์์์ ๋ ฌ
- ๋ฐฑ์ค
- ๋ฒจ๋งํฌ๋
- ํ๋ก๊ทธ๋๋จธ์ค
- tree
- ์๋ฃ๊ตฌ์กฐ
- Graph
- ์๋ฐ์์ ์
- ๋ฐฑ์๋
- ๋ค์ต์คํธ๋ผ
- ๋ฌธ๋ฒ
- leetcode
- ๋ฐ์ดํฐ๋ฒ ์ด์ค
- java
- ์ธํด
- MST
- dp
- spring
- database
Partially Committed
[ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 1167 (JAVA) - dfs / ๋ค์ต์คํธ๋ผ ๋ณธ๋ฌธ
[ํธ๋ฆฌ์ ์ง๋ฆ ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 1167 (JAVA) - dfs / ๋ค์ต์คํธ๋ผ
WonderJay 2023. 3. 20. 18:15https://www.acmicpc.net/problem/1167
๋ฌธ์ ์ํฉ์ ๋๊ฒ ๋จ์ํ๋ค.
๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์ฃผ์ด์ก์ ๋,
์์์ A ๋ ธ๋๋ถํฐ B ๋ ธ๋๊น์ง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ ๊ฒ์ด๊ณ
๊ทธ ์ค ์ต์ฅ ๊ฒฝ๋ก๋ฅผ ํธ๋ฆฌ์ ์ง๋ฆ์ด๋ผ๊ณ ์ ์ํ๋ค.
ํธ๋ฆฌ์ ์ง๋ฆ์ ๋ฐํํ๋ฉด ๋๋ค.
์.. ์ด๋ป๊ฒ ํ์ง?
์ผ๋จ ์๊ฐ ์ ํ์ 2์ด๋ก ํ๋ฒํ ํธ์ด๊ณ ,
๋ฐ์ดํฐ๋ฅผ ๋ณด๋๊น ๋ ธ๋์ ๊ฐ์๋ 100000 ๊ฐ์ด๋ค.
์์ง์ ๊ฐ์๋ ์ฃผ์ด์ง์ง ์์์ผ๋, ์ต๋ 100000 - 1 ๊ฐ๊ฐ ์กด์ฌํ ์ ์์ ๊ฒ์ด๋ค.
์ด์จ๋ ๊ฐ์ ์ต์ฅ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ค๊ณ ์น๋ฉด
๋ค์ต์คํธ๋ผ๋ฅผ ์กฐ๊ธ ๋ณํํด์ ๊ตฌํ ์ ์์ ํ ๋ฐ
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(VlogE) ์ด๊ณ
100000 * Log(100000) ~= 500000 ์ด๋ค.
๊ทธ๋ผ ์๋ฌด ๋ ธ๋์ ๋ํด์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ์ต์ฅ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ์.
๊ทธ๋ฆฌ๊ณ ๋์ ๊ฐ์ฅ ๋จผ ๊ฑฐ๋ฆฌ์ ํด๋นํ๋ ๋ ธ๋๋ฅผ ์ฐพ์.
๊ทธ ๋ ธ๋์ ๋ํด์ ์ต์ฅ๊ฑฐ๋ฆฌ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฒ ๋ ์ํํ๋ฉด
ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ ์ ์๋ค.
๐ง ์ ๋ ๋ฒ ์ํํด์ผ ํ ๊น?
โถ ์ต์ฅ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ํจ์๋ฅผ getLongestPath(int v) ๋ผ๊ณ ํ์. ์ด์ด ์ข๊ฒ๋ v ๊ฐ ๋ฃจํธ ํน์ ๋ฆฌํ ๋ ธ๋๋ผ๋ฉด ํ ๋ฒ๋ง ์ํํด๋ ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด๋ค ๋ ธ๋๊ฐ ๋ฃจํธ , ๋ฆฌํ ๋ ธ๋์ธ ์ง๋ ์ฃผ์ด์ง์ง ์๊ธฐ ๋๋ฌธ์ v ๊ฐ์ผ๋ก๋ ์์์ ๋ ธ๋๋ฅผ ํํ ์ ๋ฐ์ ์๋ค. ์์๋ก ์ ํํ v ๋ ธ๋๊ฐ ํธ๋ฆฌ์ ํ ๊ฐ์ด๋ฐ ์์นํ ๋ ธ๋๋ผ๊ณ ์์ํด๋ณด์. ๊ทธ๋ผ v ๋ ธ๋์์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋๋ผ๋, ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก v ๋ ธ๋์์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋(A)๋ฅผ ์ฐพ๊ณ , ํด๋น ๋ ธ๋์์ getLongestPath ๋ฅผ ๋ค์ ์ํํด์ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋ ๋ ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ํด๋น ํธ๋ฆฌ์์ ์ต์ฅ ๊ฒฝ๋ก๊ฐ ๋ ๊ฒ์ด๊ณ ์ด๊ฒ์ด ๋ฐ๋ก ํธ๋ฆฌ์ ์ง๋ฆ์ด๋ค. (์กฐ๊ธ ๋ ์๋ฐํ๊ฒ ์ฆ๋ช ์ ํ๊ณ ์ถ์๋ฐ... ์ง๊ธ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค ๐ข)
์ด๋ ๊ฒ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ 2 ๋ฒ ์ํํด์ ๊ตฌํ ์๋ ์๊ณ
๊ทธ๋ฅ DFS ๋ก dist ๋ฐฐ์ด์ ๊ฐฑ์ ํด๊ฐ๋ฉด์ ํด๊ฒฐํ ์๋ ์๋ค.
DFS ๋ฅผ ์ํํ ๊ฒฝ์ฐ O(n+m) ~= O(200000) ์ด๋ฏ๋ก
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๋ณด๋ค๋ ์กฐ๊ธ ๋ ๋น ๋ฅธ ์๊ฐ ๋ณต์ก๋๋ก ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๊ตฌํ์ด ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋จผ์ DFS ๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
import java.io.*;
import java.util.*;
public class Main {
static int v;
static ArrayList<Node>[] graph;
static int[] dist;
static boolean[] visited;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
v = Integer.parseInt(br.readLine()); // ์ ์ ์ ๊ฐ์
dist = new int[v + 1];
visited = new boolean[v + 1];
graph = new ArrayList[v + 1];
for (int i = 0; i <= v; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 1; i <= v; i++) {
stk = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stk.nextToken());
while (true) {
int b = Integer.parseInt(stk.nextToken());
if (b == -1) break;
int w = Integer.parseInt(stk.nextToken());
graph[a].add(new Node(b, w));
}
}
dfs(1);
int max = -1;
int max_node = -1;
for (int i = 1; i <= v; i++) {
if (dist[i] >= max) {
max = dist[i];
max_node = i;
}
}
dist = new int[v + 1];
visited = new boolean[v + 1];
dfs(max_node);
for (int i = 1; i <= v; i++) {
max = Math.max(max, dist[i]);
}
bw.write(max + "\n");
bw.flush();
br.close();
bw.close();
}
static class Node {
int to;
int w;
public Node(int to, int w) {
this.to = to;
this.w = w;
}
}
static void dfs(int v) {
visited[v] = true;
for (Node ele : graph[v]) {
// ์ฐ๊ฒฐ๋ ๋
ธ๋๋ฅผ ํ์
if (!visited[ele.to]) {
// ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด
visited[ele.to] = true; // ๋ฐฉ๋ฌธ
dist[ele.to] = dist[v] + ele.w;
dfs(ele.to);
}
}
}
}
์ ์ฝ๋๋ฅผ ์ด์ฉํ๋ฉด AC ๋ฅผ ๋ฐ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์.
dfs ํจ์ ๋์ ์ Dijkstra ํจ์๋ฅผ ๊ตฌํํด์ ๋์ฒดํด์ฃผ๋ฉด ๋๋ค.
์ฃผ์ํ ๊ฒ์ ์ต์ฅ๊ฑฐ๋ฆฌ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ด๋ฏ๋ก
์ด๊ธฐํ ํ๋ ๋ถ๋ถ์ด๋ผ๋๊ฐ,
๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๋ถ๋ถ์ ์กฐ๊ฑด๋ฌธ,
Node ์ Comparable ์ ๊ตฌํํ๋ ๋ฐ์์
์ผ๋ฐ์ ์ธ ์ต๋จ๊ฑฐ๋ฆฌ Dijkstra ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ๋ฐ๋๋ก ํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค!
import java.io.*;
import java.util.*;
public class Main {
static int v;
static ArrayList<Node>[] graph;
static int[] dist;
static boolean[] visited;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer stk;
v = Integer.parseInt(br.readLine()); // ์ ์ ์ ๊ฐ์
dist = new int[v + 1];
visited = new boolean[v + 1];
graph = new ArrayList[v + 1];
for (int i = 0; i <= v; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 1; i <= v; i++) {
stk = new StringTokenizer(br.readLine());
int a = Integer.parseInt(stk.nextToken());
while (true) {
int b = Integer.parseInt(stk.nextToken());
if (b == -1) break;
int w = Integer.parseInt(stk.nextToken());
graph[a].add(new Node(b, w));
}
}
dijkstra(new Node(1, 0));
int max = -1;
int max_node = -1;
for (int i = 1; i <= v; i++) {
if (dist[i] >= max) {
max = dist[i];
max_node = i;
}
}
dist = new int[v + 1];
visited = new boolean[v + 1];
dijkstra(new Node(max_node, 0));
for (int i = 1; i <= v; i++) {
max = Math.max(max, dist[i]);
}
bw.write(max + "\n");
bw.flush();
br.close();
bw.close();
}
static class Node implements Comparable<Node> {
int to;
int w;
public Node(int to, int w) {
this.to = to;
this.w = w;
}
@Override
public int compareTo(Node o) {
if(this.w <= o.w){
return 1;
} return -1;
}
}
static void dijkstra(Node start){
PriorityQueue<Node> pq = new PriorityQueue<>();
Arrays.fill(dist, -Integer.MAX_VALUE);
dist[start.to] = 0;
visited[start.to] = true;
pq.add(start);
while(!pq.isEmpty()){
Node now = pq.poll();
for(Node ele : graph[now.to]){
// ์ฐ๊ฒฐ๋ ๋
ธ๋ ํ์
if(!visited[ele.to]){
if(dist[ele.to] < dist[now.to] + ele.w){
// ๋ ์ต์ฅ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฒฌํ๋ค๋ฉด
dist[ele.to] = dist[now.to] + ele.w;
visited[ele.to] = true;
pq.add(new Node(ele.to, dist[ele.to]));
}
}
}
}
}
}
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ณํํ๋ ๊ณผ์ ์์ ์ค์๊ฐ ๋์ฌ ์๋ ์์ด์
๊ทธ๋ฅ DFS ๋ก ๊ตฌํํ๋ ๊ฒ์ด ์กฐ๊ธ ๋ ๊ฐ๋จํ๊ธฐ๋ ํ๊ณ
์๊ฐ ์ ํ๋ ์กฐ๊ธ ๋ ๋๋ํ๊ฒ ํต๊ณผํ ์ ์์ผ๋ฏ๋ก ์ข์ ๊ฒ ๊ฐ๋ค.
2023. 03. 20. ์.
'๐ฅ Algorithm || ๋ฌธ์ ํ์ด > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 1162 ๋๋กํฌ์ฅ] ์๋ฐ (๋ค์ต+DP) (0) | 2023.05.28 |
---|---|
[InOrder ์ PostOrder ๋ก๋ถํฐ PreOrder ๊ตฌํ๊ธฐ] ๋ฐฑ์ค 2263 ํธ๋ฆฌ์ ์ํ (JAVA) (0) | 2023.03.22 |
[Union and Find] ๋ฐฑ์ค 20040 ์ฌ์ดํด ๊ฒ์ (0) | 2023.03.07 |
[Meet in the middle] ๋ฐฑ์ค 1450 ๋ ์ ๋ฌธ์ (0) | 2023.03.06 |
[๋ฐฑ์ค 13549/1956/1620/2629] ์๋ฐ (0) | 2023.02.22 |