Skip to content

Commit 4c4a74e

Browse files
authored
05 최단 경로
05 최단 경로
2 parents 7a8e44e + 8e00d2e commit 4c4a74e

File tree

6 files changed

+384
-0
lines changed

6 files changed

+384
-0
lines changed

05_shortest_path/kim/13549.java

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static class Node {
6+
int time;
7+
int now;
8+
9+
Node(int time, int now) {
10+
this.time = time;
11+
this.now = now;
12+
}
13+
}
14+
15+
public static void main(String[] args) throws IOException {
16+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
17+
StringTokenizer st = new StringTokenizer(br.readLine());
18+
19+
int N = Integer.parseInt(st.nextToken());
20+
int K = Integer.parseInt(st.nextToken());
21+
22+
if (N >= K) {
23+
System.out.println(N - K);
24+
return;
25+
}
26+
27+
int[] go = new int[140_001];
28+
for (int i = 0; i < go.length; i++) {
29+
go[i] = Integer.MAX_VALUE;
30+
}
31+
32+
PriorityQueue<Node> queue = new PriorityQueue<>((s, e) -> Integer.compare(s.time, e.time));
33+
queue.add(new Node(0, N));
34+
35+
while (!queue.isEmpty()) {
36+
Node now = queue.poll();
37+
int nnode = now.now;
38+
if (nnode == K) {
39+
System.out.println(now.time);
40+
return;
41+
}
42+
43+
int[] move = { nnode + 1, nnode - 1 };
44+
for (int next : move) {
45+
if (next < 0 || next > 140_000) continue;
46+
if (go[next] > now.time + 1 && now.time + 1 <= (K-N)) {
47+
queue.add(new Node(now.time + 1, next));
48+
go[next] = now.time + 1;
49+
}
50+
}
51+
52+
if (nnode * 2 <= 0 || nnode * 2 > 140_000) continue;
53+
else {
54+
if (go[nnode * 2] > now.time && now.time <= (K-N)) {
55+
queue.add(new Node(now.time, nnode * 2));
56+
go[nnode * 2] = now.time;
57+
}
58+
}
59+
}
60+
}
61+
}

05_shortest_path/kim/1446.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
5+
public class Main {
6+
static class Node{
7+
int s;
8+
int e;
9+
int w;
10+
Node(int s, int e, int w) {
11+
this.s = s;
12+
this.e = e;
13+
this.w = w;
14+
}
15+
}
16+
17+
public static void main(String[] args) throws IOException {
18+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
19+
StringTokenizer st = new StringTokenizer(br.readLine());
20+
int N = Integer.parseInt(st.nextToken());
21+
int D = Integer.parseInt(st.nextToken());
22+
23+
int[] dp = new int[10_001];
24+
Arrays.fill(dp, Integer.MAX_VALUE);
25+
dp[0] = 0;
26+
27+
Set<Integer> set = new HashSet<>();
28+
List<Node> list = new ArrayList<>();
29+
30+
for(int n = 0; n < N; n++) {
31+
st = new StringTokenizer(br.readLine());
32+
33+
int s = Integer.parseInt(st.nextToken());
34+
int e = Integer.parseInt(st.nextToken());
35+
int w = Integer.parseInt(st.nextToken());
36+
37+
if (e > D) continue;
38+
39+
list.add(new Node(s, e, w));
40+
41+
set.add(s);
42+
set.add(e);
43+
}
44+
45+
for(int i = 0; i < 10_000; i++) {
46+
dp[i + 1] = Math.min(dp[i+1], dp[i] + 1);
47+
48+
for(Node now : list) {
49+
if(now.s == i)
50+
dp[now.e] = Math.min(dp[i] + now.w, dp[now.e]);
51+
}
52+
}
53+
54+
System.out.println(dp[D]);
55+
}
56+
}

05_shortest_path/kim/14938.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
5+
public class Main {
6+
7+
public static void main(String[] args) throws IOException {
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringBuilder sb = new StringBuilder();
10+
11+
StringTokenizer st = new StringTokenizer(br.readLine());
12+
int N = Integer.parseInt(st.nextToken());
13+
int M = Integer.parseInt(st.nextToken());
14+
int R = Integer.parseInt(st.nextToken());
15+
16+
int[] items = new int[N];
17+
boolean[] visited = new boolean[N];
18+
int[][] map = new int[N+1][N+1];
19+
20+
// 아이템 초기화
21+
st = new StringTokenizer(br.readLine());
22+
for(int n = 0; n < N; n++)
23+
items[n] = Integer.parseInt(st.nextToken());
24+
25+
// 맵 초기화
26+
for(int i = 1; i <= N; i++) {
27+
for(int j = 1; j <= N; j++) {
28+
if(i == j) continue;
29+
map[i][j] = Integer.MAX_VALUE;
30+
}
31+
}
32+
33+
for(int r = 0; r < R; r++) {
34+
st = new StringTokenizer(br.readLine());
35+
int s = Integer.parseInt(st.nextToken());
36+
int e = Integer.parseInt(st.nextToken());
37+
int w = Integer.parseInt(st.nextToken());
38+
if (w > M) continue;
39+
map[s][e] = w;
40+
map[e][s] = w;
41+
}
42+
43+
for(int m = 1; m <= N; m++) {
44+
for(int s = 1; s <= N; s++) {
45+
for(int e =1; e <= N; e++) {
46+
if (map[s][m] == Integer.MAX_VALUE || map[m][e] == Integer.MAX_VALUE) continue;
47+
if (map[s][m] + map[m][e] > M) continue;
48+
49+
map[s][e] = Math.min(map[s][e], map[s][m] + map[m][e]);
50+
}
51+
}
52+
}
53+
54+
int max = 0;
55+
for(int i = 1; i <= N; i++) {
56+
int buf = 0;
57+
Set<Integer> set = new HashSet<>();
58+
59+
for(int j = 1; j <= N; j++) {
60+
if (map[i][j] != Integer.MAX_VALUE) set.add(j);
61+
}
62+
for(int s : set) buf += items[s-1];
63+
max = Math.max(max, buf);
64+
}
65+
66+
System.out.println(max);
67+
}
68+
}

05_shortest_path/kim/1719.java

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
5+
public class Main {
6+
static int N;
7+
static HashMap<Integer, List<Node>> routes;
8+
static StringBuilder sb = new StringBuilder();
9+
10+
static class Node {
11+
int node;
12+
int dist;
13+
int route;
14+
15+
Node(int node, int dist, int route) {
16+
this.node = node;
17+
this.dist = dist;
18+
this.route = route;
19+
}
20+
21+
@Override
22+
public String toString() {
23+
return "{node} " + this.node + " " + this.dist + " " + this.route;
24+
}
25+
}
26+
27+
public static void dijkstra(int startNode) {
28+
PriorityQueue<Node> queue = new PriorityQueue<>((s, e) -> s.dist- e.dist);
29+
30+
int[] path = new int[N+1];
31+
path[startNode] = startNode;
32+
for(Node n : routes.getOrDefault(startNode, new ArrayList<>())) {
33+
queue.add(new Node(n.node, n.dist, n.route));
34+
}
35+
36+
while (!queue.isEmpty()) {
37+
Node now = queue.poll();
38+
if (path[now.node] != 0) continue;
39+
path[now.node] = now.route;
40+
for(Node n : routes.getOrDefault(now.node, new ArrayList<>())) {
41+
if (path[n.node] == 0) {
42+
queue.add(new Node(n.node, now.dist + n.dist, now.route));
43+
}
44+
}
45+
}
46+
47+
for(int i = 1; i <= N; i++) {
48+
if (i == startNode) sb.append("- ");
49+
else sb.append(path[i]).append(" ");
50+
}
51+
sb.append("\n");
52+
53+
}
54+
55+
public static void main(String[] args) throws IOException {
56+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
57+
StringTokenizer st = new StringTokenizer(br.readLine());
58+
59+
N = Integer.parseInt(st.nextToken());
60+
int M = Integer.parseInt(st.nextToken());
61+
62+
routes = new HashMap<>();
63+
64+
for(int m = 0; m < M; m++) {
65+
st = new StringTokenizer(br.readLine());
66+
int s = Integer.parseInt(st.nextToken());
67+
int e = Integer.parseInt(st.nextToken());
68+
int w = Integer.parseInt(st.nextToken());
69+
70+
if (!routes.containsKey(s))
71+
routes.put(s, new ArrayList<>());
72+
if (!routes.containsKey(e))
73+
routes.put(e, new ArrayList<>());
74+
75+
routes.get(s).add(new Node(e, w, e));
76+
routes.get(e).add(new Node(s, w, s));
77+
}
78+
79+
for(int i = 1; i <= N; i++) {
80+
dijkstra(i);
81+
}
82+
83+
System.out.println(sb);
84+
}
85+
}

05_shortest_path/kim/18352.java

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
5+
public class Main {
6+
public static void main(String[] args) throws Exception {
7+
8+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
StringTokenizer st = new StringTokenizer(br.readLine());
10+
11+
int N = Integer.parseInt(st.nextToken()); // 도시 개수
12+
int M = Integer.parseInt(st.nextToken()); // 도로 개수
13+
int K = Integer.parseInt(st.nextToken()); // 거리 정보
14+
int X = Integer.parseInt(st.nextToken()); // 출발 도시
15+
16+
Map<Integer, List<Integer>> roads = new HashMap<>();
17+
18+
for(int i = 0; i < M; i++) {
19+
st = new StringTokenizer(br.readLine());
20+
int s = Integer.parseInt(st.nextToken());
21+
int e = Integer.parseInt(st.nextToken());
22+
23+
List<Integer> buf = roads.getOrDefault(s, new ArrayList<>());
24+
buf.add(e);
25+
roads.put(s, buf);
26+
}
27+
28+
int[] minDist = new int[N+1];
29+
boolean[] visited = new boolean[N+1];
30+
31+
Queue<Integer> queue = new LinkedList<>();
32+
queue.add(X);
33+
visited[X] = true;
34+
while(!queue.isEmpty()) {
35+
int now = queue.poll();
36+
for(int next : roads.getOrDefault(now, new ArrayList<>())) {
37+
if (!visited[next]) {
38+
minDist[next] = minDist[now] + 1;
39+
queue.add(next);
40+
visited[next] = true;
41+
}
42+
}
43+
}
44+
45+
StringBuilder sb = new StringBuilder();
46+
boolean isAns = false;
47+
for(int i = 1; i <= N; i++) {
48+
if(minDist[i] == K) {
49+
sb.append(i).append("\n");
50+
isAns = true;
51+
}
52+
}
53+
54+
System.out.println(isAns ? sb : -1);
55+
}
56+
}

05_shortest_path/kim/4485.java

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
5+
public class Main {
6+
7+
static int[][] move = {{1,0}, {0,1}, {-1, 0}, {0, -1}};
8+
9+
public static void main(String[] args) throws IOException {
10+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
11+
StringBuilder sb = new StringBuilder();
12+
13+
int test = 1;
14+
15+
while(true) {
16+
int N = Integer.parseInt(br.readLine());
17+
if (N == 0) break;
18+
19+
int[][] map = new int[N][N];
20+
int[][] result = new int[N][N];
21+
boolean[][] visited = new boolean[N][N];
22+
23+
for(int i = 0; i < N; i++) {
24+
StringTokenizer st = new StringTokenizer(br.readLine());
25+
for(int j = 0; j <N; j++) {
26+
int num = Integer.parseInt(st.nextToken());
27+
map[i][j] = num;
28+
result[i][j] = num;
29+
}
30+
}
31+
32+
Queue<int[]> queue = new LinkedList<>();
33+
queue.add(new int[] {0, 0});
34+
visited[0][0] = true;
35+
result[0][0] = map[0][0];
36+
37+
while(!queue.isEmpty()) {
38+
int[] now = queue.poll();
39+
40+
for(int[] mv : move) {
41+
int nextn = now[0] + mv[0];
42+
int nextm = now[1] + mv[1];
43+
44+
if(nextn < 0 || nextm < 0 || nextn >= N || nextm >= N) continue;
45+
if(visited[nextn][nextm] && result[nextn][nextm] <= result[now[0]][now[1]] + map[nextn][nextm]) continue;
46+
47+
result[nextn][nextm] = result[now[0]][now[1]] + map[nextn][nextm];
48+
visited[nextn][nextm] = true;
49+
queue.add(new int[] {nextn, nextm});
50+
}
51+
}
52+
53+
sb.append("Problem ").append(test++).append(": ").append(result[N-1][N-1]).append("\n");
54+
}
55+
56+
System.out.println(sb);
57+
}
58+
}

0 commit comments

Comments
 (0)