- κ°μ μ€μ¬ μκ³ λ¦¬μ¦ π κ·Έλνλ€μ μμ§ λ¦¬μ€νΈλ‘ ꡬν
- μμ κ°μ μ΄ ν¬ν¨λ μν©μμμ μ΅λ¨ 거리 λ¬Έμ μ μ¬μ©.
- μμ κ°μ μ μνμ κ°μ§ν μ μμ.
- λ§€λ² λͺ¨λ κ°μ μ μ λΆ νμΈ
- μ΅λ¨ 거리 리μ€νΈμμ μ λ°μ΄νΈ λ°λ³΅ νμλ V - 1
- μκ°λ³΅μ‘λ : O(VE), λ€μ΅μ€νΈ μκ³ λ¦¬μ¦μ λΉν΄ λ리λ€
μμκ°μ μ΄ μμ΄λ μνμ΄ λ°μνμ§ μλλ€λ©΄ μ΅λ¨κ±°λ¦¬λ₯Ό κ³μ°ν μ μλ€.
(μμκ°μ μ μνμ΄ λ°μνλ©΄ μ΅λ¨κ±°λ¦¬κ° μμ 무νμΈ λ Έλκ° λ°μνκ² λ¨)
λμμ리
1. μΆλ° λ Έλλ₯Ό μ€μ
2. μ΅λ¨ 거리 ν μ΄λΈμ μ΄κΈ°ν
3. λ€μμ κ³Όμ μ N-1 λ² λ°λ³΅
3-1. μ 체 κ°μ Eκ°λ₯Ό νλμ© νμΈ
3-2. κ° κ°μ μ κ±°μ³ λ€λ₯Έ λ Έλλ‘ κ°λ λΉμ©μ κ³μ°νμ¬ μ΅λ¨κ±°λ¦¬ ν μ΄λΈμ κ°±μ
4. λ§μ½ μμ κ°μ μνμ΄ λ°μνλμ§ μ²΄ν¬νκ³ μΆλ€λ©΄ 3λ²μ κ³Όμ μ ν λ² λ μν.
4-1. λ§μ½ μ΅λ¨κ±°λ¦¬ ν μ΄λΈμ΄ κ°±μ λλ€λ©΄ μμ κ°μ μνμ΄ μ‘΄μ¬νλ€λ λ»μ΄λ€.
- λ€μ΅μ€νΈλΌ
- λ§€λ² λ°©λ¬Ένμ§ μμ λ Έλ μ€ μ΅λ¨κ±°λ¦¬κ° κ°μ₯ 짧μ λ Έλλ₯Ό μ ν
- μμ κ°μ μ΄ μλ€λ©΄ μ΅λ¨κ±°λ¦¬λ₯Ό μ°Ύμ μ μλ€.
- λ²¨λ§ ν¬λ μκ³ λ¦¬μ¦
- λ§€λ² λͺ¨λ κ°μ μ μ λΆ νμΈ (λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦λ³΄λ€ λ리λ€)
- μμ κ°μ μνμ νμ§ν μ μμ.
μ½λ
import sys
input = sys.stdin.readline
INF = int(1e9)
def bf(start):
# μμ λ
Έλμ λν΄μ μ΄κΈ°ν
dist[start] = 0
# μ 체 nλ²μ λΌμ΄λ(round)λ₯Ό λ°λ³΅
for i in range(n):
chk = False
# 맀 λ°λ³΅λ§λ€ "λͺ¨λ κ°μ "μ νμΈ
for j in range(m):
cur = edges[j][0]
next_node = edge[j][1]
cost = edge[j][2]
# νμ¬ κ°μ μ κ±°μ³μ λ€λ₯Έ λ
Έλλ‘ μ΄λνλ κ±°λ¦¬κ° λ 짧μ κ²½μ°
if dist[cur] != INF and dist[next_node] > dist[cur] + cost:
chk = True
dist[next_node] = dist[cur] + cost
# nλ²μ§Έ λΌμ΄λμμλ κ°μ΄ κ°±μ λλ€λ©΄ μμ μνμ΄ μ‘΄μ¬
if i==n-1:
return True
if (not chk): # chkκ° Falseμ΄λ©΄ λ μ΄μ κ°μ μ΄ μ
λ°μ΄νΈλ κ² μκΈ° λλ¬Έμ, λ λ°λ³΅λ¬Έμ λ릴 νμκ° μλ€.
break
return False
n,m = map(int,input().split())
edges = []
dist [INF] * (n+1)
for _ in range(m):
a,b,c = map(int,input().split())
edges.append((a,b,c))
negative_cycle = bf(1) # 벨λ§ν¬λ μν, 1λ²λ
Έλκ° μμλ
Έλ
if negative_cycle:
print("-1")
else:
for i in range(2, n+1):
if dist[i]==INF:
print("-1")
else:
print(dist[i])
μμμν κ²μ¬νλ 벨λ§ν¬λ μκ³ λ¦¬μ¦ (λ°±μ€ 1865λ²)
https://www.acmicpc.net/problem/1865
- dist[cur] != INF 쑰건μ μ κ±°
- μ΄λ μμμ μ μ μΆλ°μ μΌλ‘ μ‘μλ λλ€.
- μ΅λ¨κ²½λ‘λ ꡬνμ§ λͺ»ν¨
package com.mincheolsong;
import java.io.*;
import java.util.*;
class Node{
int from, to, w;
public Node(int from, int to, int w){
this.from = from;
this.to = to;
this.w = w;
}
}
public class Main {
// 벨λ§ν¬λ
static final int INF = (int)1e9;
static int N,M,W;
static List<Node> graph;
static int[] dist;
static boolean solve(){
Arrays.fill(dist,INF);
dist[1]=0; // μμμ μ μ 1λ‘ (μ무거λ) μ΄κΈ°ν
for(int i=1;i<=N;i++){
boolean chk = false;
for(int j=0;j<graph.size();j++){ // λͺ¨λ κ°μ
Node node = graph.get(j);
if(dist[node.to] > dist[node.from] + node.w){
dist[node.to] = dist[node.from] + node.w;
chk = true;
if(i==N){ // Nλ²μ§Έμλ κ°±μ μ΄ μΌμ΄λλ©΄ μμ μνμ΄ μμ
return true;
}
}
}
if(!chk){ // chkκ° falseμ΄λ©΄ λ μ΄μ κ°μ μ΄ μ
λ°μ΄νΈλ κ² μκΈ° λλ¬Έμ, λ λ°λ³΅λ¬Έμ λ릴 νμκ° μλ€.
break;
}
}
return false;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int TC = Integer.parseInt(br.readLine());
for(int t=0;t<TC;t++){
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
W = Integer.parseInt(st.nextToken());
graph = new ArrayList<>();
dist = new int[N+1];
for(int m=0;m<M;m++){
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
graph.add(new Node(from,to,weight));
graph.add(new Node(to,from,weight));
}
for(int w=0;w<W;w++){
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
int to = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
graph.add(new Node(from,to,-weight));
}
boolean ans = solve();
if(ans){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
}
}
'πμ½λ©ν μ€νΈ:CodingTest' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
BFS (λ°±μ€ 16234 μΈκ΅¬μ΄λ) (1) | 2024.02.09 |
---|---|
λ μ§μ μ΄ λμμ, λ²½μ λΏκΈ° μ κΉμ§ μμ§μ΄λ bfs (λ°±μ€ 13460 ꡬμ¬νμΆ2) (1) | 2024.01.21 |
μλ‘μ μ§ν© μλ£κ΅¬μ‘° (Union Find) (λ°±μ€ 1043λ²) (0) | 2024.01.03 |
λ€μ΅μ€νΈλΌ (boj 12851 μ¨λ°κΌμ§2) (0) | 2024.01.02 |
μ΄μ§ κ²μ νΈλ¦¬ (λ°±μ€ 5639λ²) (0) | 2023.12.28 |