Vκ°μ μ μ κ³Ό Eκ°μ κ°μ μ κ°μ§ κ°μ€ κ·Έλν Gμμ νΉμ μΆλ° μ μ (S)μμλΆν° λ€λ₯Έ λͺ¨λ μ μ κΉμ§μ μ΅λ¨κ²½λ‘λ₯Ό ꡬνλ μκ³ λ¦¬μ¦μ΄λ€.
π νΉμ§
- μμ κ°μ€μΉλ₯Ό κ°λ κ°μ λ μ‘΄μ¬ κ°λ₯νλ€.
- μμ μ¬μ΄ν΄μ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈν μ μλ€.
- μ΅λ¨κ±°λ¦¬λ₯Ό ꡬνκΈ° μν΄μλ V-1λ² Eκ°μ λͺ¨λ κ°μ μ νμΈνλ€.
- μμ μ¬μ΄ν΄ μ‘΄μ¬ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ ν λ² λ Eκ°μ κ°μ μ νμΈνλ€.
- μ΄ μ°μ° νμ = VxE
- βοΈ μκ° λ³΅μ‘λ = O(VE)
- Vλ²μ§Έ λͺ¨λ κ°μ μ νμΈνμ λ 거리배μ΄μ΄ κ°±μ λμλ€λ©΄ κ·Έλν Gλ μμ μ¬μ΄ν΄μ κ°μ§λ κ·Έλνμ΄λ€.

μμ κ°μ΄ μμ κ°μ€μΉλ₯Ό κ°κ³ μλ κ·Έλνκ° μμ λ,
λ€μ΅μ€νΈλΌλ‘ μ μ 1μμ λͺ¨λ μ μ κΉμ§μ 거리λ₯Ό ꡬννλ€λ©΄
1 β 2 = 1
1 β 2 β 3 = 2
1 β 2 β 3 β 4 = 4κ° λλ€. (μ μ 2λ₯Ό μ΄λ―Έ λ°©λ¬ΈνκΈ° λλ¬Έμ 4 β 2μ κ²½λ‘λ κ³ λ € X)
νμ§λ§ μ¬μ€μ 1 β 2μ μ΅λ¨κ²½λ‘λ -∞ μ΄λ€. (μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νκ³ μμκ°μ΄ λ ν¬λ―λ‘)
μ΄λ¬ν λͺ¨μμ ν΄κ²°νκΈ° μν΄ λ²¨λ§ν¬λ μκ³ λ¦¬μ¦μ μ¬μ©ν΄μΌ νλ€.
πΉοΈ λ²¨λ§ ν¬λ κ³Όμ
1οΈβ£ μΆλ°μ§λ‘λΆν° μ΅λ¨κ±°λ¦¬λ₯Ό κΈ°λ‘νλ λ°°μ΄(dist[])μ μΆλ°μ§λ 0, λλ¨Έμ§λ INF(무ν)μΌλ‘ μ΄κΈ°ννλ€.
2οΈβ£ λ€μ κ³Όμ μ V-1λ² λ°λ³΅νλ€.
- μ 체 κ°μ Eκ°λ₯Ό νλμ© λ°©λ¬Έν΄μ νμΈνλ€. (νμ¬ μ μ μ λͺ¨λ μΈμ ν μ μ νμ)
- κΈ°μ‘΄μ μ μ₯λ μΈμ μ μ κΉμ§μ κ±°λ¦¬λ³΄λ€ νμ¬ μ μ μ κ±°μΉκ³ μΈμ μ μ μ λλ¬νλ κ²μ΄ λ 짧μ κ²½μ° κ°μ κ°±μ νλ€.
3οΈβ£ λ§μ§λ§μΌλ‘ ν λ² λ(Vλ²μ§Έ) 2οΈβ£λ²μ κ³Όμ μ λ°λ³΅νλλ°, μ΄ λ μ΅λ¨ 거리 λ°°μ΄μ΄ κ°±μ λλ€λ©΄ μμ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ²μ΄λ€.
β‘οΈ "λμΌ μ μ μ λ°©λ¬Ένμ§ μλλ€" λΌλ μ μ½μ‘°κ±΄ νμΈ ! (μ μ½ μ‘°κ±΄μ΄ μλ€λ©΄ μμ μ¬μ΄ν΄ λμ¬ μ μμ)
π©π» λ²¨λ§ ν¬λ μ½λ ꡬν
public class Main{
static ArrayList<Info> graph;
static final int INF = 1000000000;
public static class Info{
int v, w, cost;
public Info(int v, int w, int cost){
this.v = v;
this.w = w;
this.cost = cost;
}
}
public static boolean BellmanFord(int n, int m, int start){
int[] dist = new int[n+1];
Arrays.fill(dist, INF);
dist[start]=0;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
Info info = graph.get(j);
// νμ¬ κ°μ μ λ€μ΄μ€λ μ μ μ λν΄ λΉκ΅
if(dist[info.v]!=INF && dist[info.w] >= dist[info.v] + info.cost){
dist[info.w] = dist[info.v] + info.cost;
}
}
}
// μμ κ°μ€μΉ νμΈ
for(int i=0; i<m; i++){
Info info = graph.get(i);
if(dist[info.v]!=INF && dist[info.w] > dist[info.v] + info.cost){
System.out.println("μμ μ¬μ΄ν΄ μ‘΄μ¬");
return false;
}
}
//μΆλ ₯
for (int i = 1; i < dist.length; i++) {
if (dist[i] == INF)
System.out.print("INF ");
else
System.out.print(dist[i] + " ");
}
return true;
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine()); // μ μ κ°μ
int m = Integer.parseInt(br.readLine()); // κ°μ κ°μ
graph = new ArrayList<>();
for(int i=0; i<m; i++){
st = new StringTokenizer(br.readLine());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
int cost = Integer.parseInt(st.nextToken());
graph.add(new Info(v, w, cost));
}
BellmanFord(n, m, 4);
}
}
π‘ λ€μ΅μ€νΈλΌμ λ²¨λ§ ν¬λ λΉκ΅
π λ€μ΅μ€νΈλΌ
- μμ κ°μ€μΉλ₯Ό κ°μ§ μ μλ€.
- λ²¨λ§ ν¬λ μκ³ λ¦¬μ¦λ³΄λ€ μκ°λ³΅μ‘λκ° λΉ λ₯΄λ€. β‘οΈ κ°μ€μΉκ° λͺ¨λ μμλΌλ©΄ λ²¨λ§ ν¬λ μ¬μ© X
π λ²¨λ§ ν¬λ
- μμ κ°μ€μΉλ₯Ό κ°μ§ μ μλ€.
- μμ μ¬μ΄ν΄ μ‘΄μ¬μ¬λΆλ₯Ό νμΈνλ€. (μ‘΄μ¬ μ μλ―Έ μλ κ° λ°ν)
μ°Έκ³ μλ£
https://www.youtube.com/watch?v=061eXyAFRuI
'μκ³ λ¦¬μ¦ > ποΈ μ 리' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
LIS (μ΅μ₯μ¦κ°λΆλΆμμ΄) (1) | 2023.12.07 |
---|---|
MST(μ΅μμ μ₯νΈλ¦¬) - ν¬λ£¨μ€μΉΌ & νλ¦Ό μκ³ λ¦¬μ¦ (1) | 2023.10.23 |
LCA (μ΅μ곡ν΅μ‘°μ) (0) | 2023.09.04 |
Binary Search (μ΄λΆνμ) (0) | 2023.09.01 |
Floyd-Warshall (νλ‘μ΄λ μμ ) (0) | 2023.08.29 |