b.11657 νμλ¨Έμ
https://www.acmicpc.net/problem/11657
π μλ°(Java)λ‘ νΈλ νμλ¨Έμ λ¬Έμ - λ°±μ€ 11657 β³
π λ¬Έμ κ°μ
λ°±μ€ 11657λ² - νμλ¨Έμ λ¬Έμ μ λλ€.
Nκ°μ λμμ Mκ°μ λ²μ€ λ Έμ μ΄ μ£Όμ΄μ§ λ,
“1λ² λμμμ λ€λ₯Έ λͺ¨λ λμλ‘ κ°λ μ΅λ¨ μκ°” μ ꡬνλ λ¬Έμ μ λλ€.
π° λ¨, μμ κ°μ€μΉ(μκ°μ΄ κ°μνλ κ²½μ°)λ μ‘΄μ¬ν μ μμΌλ©°, μμ μ¬μ΄ν΄ μ¬λΆλ₯Ό νλ³ν΄μΌ ν©λλ€.
π‘ μμ μ λ ₯
3 4
1 2 4
1 3 3
2 3 -2
3 1 -1
π‘ μμ μΆλ ₯
4
3
-1
β‘ 1λ² λμμμ κ°κ° 2λ², 3λ²μΌλ‘ κ°λ μ΅λ¨ 거리 μΆλ ₯ (λλ¬ λΆκ°λ₯ μ -1)
π μκ³ λ¦¬μ¦ μ κ·Ό λ°©μ
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ²¨λ§-ν¬λ μκ³ λ¦¬μ¦(Bellman-Ford Algorithm) μ μ¬μ©ν©λλ€.
βοΈ μ£Όμ κ³ λ € μ¬ν
β λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ μ¬μ©ν μ μλ μ΄μ → μμ κ°μ€μΉκ° μ‘΄μ¬
β 벨λ§-ν¬λ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΅λ¨ κ²½λ‘ κ³μ° (O(NM))
β N-1λ² λ°λ³΅νμ¬ λͺ¨λ λ Έλμ μ΅λ¨ 거리λ₯Ό κ°±μ
β Nλ²μ§Έμλ κ°μ΄ κ°±μ λλ©΄, μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ²
πΉ Java μ½λ ν΄μ€
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class b11657 {
static class Node {
int start, end, time;
public Node(int start, int end, int time) {
this.start = start;
this.end = end;
this.time = time;
}
}
static int N, M;
static ArrayList<Node> edges;
static long[] dist; // long νμ
μ¬μ© (μ€λ²νλ‘μ° λ°©μ§)
static final long INF = Long.MAX_VALUE;
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());
edges = new ArrayList<>();
dist = new long[N + 1];
Arrays.fill(dist, INF);
dist[1] = 0; // μμμ 거리 0
// κ°μ μ 보 μ
λ ₯
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());
edges.add(new Node(a, b, c));
}
// 벨λ§-ν¬λ μν
if (bellmanFord()) {
System.out.println("-1"); // μμ μ¬μ΄ν΄ μ‘΄μ¬ μ -1 μΆλ ₯
} else {
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= N; i++) { // 1λ² λμ μ μΈ μΆλ ₯
if (dist[i] == INF) {
sb.append("-1\n"); // λλ¬ν μ μλ κ²½μ° -1 μΆλ ₯
} else {
sb.append(dist[i]).append("\n");
}
}
System.out.println(sb);
}
}
private static boolean bellmanFord() {
boolean hasCycle = false;
// N-1λ² λ°λ³΅ (μ΅λ¨ 거리 κ°±μ )
for (int i = 1; i < N; i++) {
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
dist[edge.end] = dist[edge.start] + edge.time;
}
}
}
// μμ μ¬μ΄ν΄ μ²΄ν¬ (Nλ²μ§Έ κ°±μ μ κ°μ΄ λ³νλ©΄ μ¬μ΄ν΄ μ‘΄μ¬)
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
hasCycle = true;
break;
}
}
return hasCycle;
}
}
π μ½λ μ€λͺ
π 1. κ·Έλν μ λ ₯ λ° μ΄κΈ°ν
edges = new ArrayList<>();
dist = new long[N + 1];
Arrays.fill(dist, INF);
dist[1] = 0; // μμμ 거리 0
β μ΅λ¨ 거리 λ°°μ΄(dist[])μ INFλ‘ μ΄κΈ°ν
β 1λ² λμμμ μΆλ°νλ―λ‘ dist[1] = 0 μ€μ
π 2. 벨λ§-ν¬λ μκ³ λ¦¬μ¦ μν
for (int i = 1; i < N; i++) { // N-1λ² λ°λ³΅
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
dist[edge.end] = dist[edge.start] + edge.time;
}
}
}
β λͺ¨λ κ°μ μ νμΈνλ©° N-1λ² λμ μ΅λ¨ 거리 κ°±μ
β νμ¬ κ°μ μ ν΅ν΄ λ μ§§μ κ±°λ¦¬κ° μ‘΄μ¬νλ©΄ κ°±μ
π 3. μμ μ¬μ΄ν΄ μ‘΄μ¬ μ¬λΆ κ²μ¬
for (Node edge : edges) {
if (dist[edge.start] != INF && dist[edge.end] > dist[edge.start] + edge.time) {
hasCycle = true;
break;
}
}
β Nλ²μ§Έ λ°λ³΅μμ κ°μ΄ λ³κ²½λλ©΄ μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬ν¨
β μ¦, μ΅λ¨ κ²½λ‘λ₯Ό κ³μ κ°±μ ν μ μλ κ²½μ°λ₯Ό μ°Ύμ
π 4. μ΅λ¨ 거리 μΆλ ₯
StringBuilder sb = new StringBuilder();
for (int i = 2; i <= N; i++) {
if (dist[i] == INF) {
sb.append("-1\n"); // λλ¬ν μ μλ κ²½μ°
} else {
sb.append(dist[i]).append("\n");
}
}
System.out.println(sb);
β 1λ² λμμμ 2~Nλ² λμλ‘μ μ΅λ¨ 거리 μΆλ ₯
β λλ¬ν μ μλ κ²½μ° -1 μΆλ ₯
π μ 리
β ν΅μ¬ ν¬μΈνΈ
β 벨λ§-ν¬λ μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΅λ¨ κ²½λ‘ κ³μ°
β μμ κ°μ€μΉκ° μ‘΄μ¬ν μ μμΌλ―λ‘ λ€μ΅μ€νΈλΌκ° μλ 벨λ§-ν¬λ νμ©
β Nλ²μ§Έ λ°λ³΅μμλ κ°μ΄ κ°±μ λλ©΄ μμ μ¬μ΄ν΄ μ‘΄μ¬ νλ³ κ°λ₯
π― μ΄ μκ³ λ¦¬μ¦μ μ₯μ
β μμ κ°μ€μΉκ° μλ μ΅λ¨ κ²½λ‘ λ¬Έμ ν΄κ²° κ°λ₯
β μμ μ¬μ΄ν΄ νλ³μ΄ κ°λ₯νμ¬ λ¬΄ν κ°μνλ κ²½λ‘λ₯Ό κ°μ§
β O(NM) 볡μ‘λλ‘ ν΄κ²° κ°λ₯νμ¬ ν¬κΈ°κ° μμ λ μ μ©
μ΄ κΈμ΄ λμμ΄ λμ ¨λ€λ©΄ μ’μμμ 곡μ λΆνλ립λλ€! π