백준_11657 타임머신 (벨만-포드)Algorithm/Algorithm 문제2024. 2. 25. 23:20
Table of Contents
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BJ_11657_타임머신 {
static long[] distance;
static Edge[] edges;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
distance = new long[n+1];
edges = new Edge[m];
int i;
for (i=1; i<n+1; i++) {
distance[i] = Integer.MAX_VALUE;
}
int u,v,w;
for (i=0; i<m; i++) {
st = new StringTokenizer(br.readLine(), " ");
u = Integer.parseInt(st.nextToken());
v = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
edges[i] = new Edge(u, v, w);
}
distance[1] = 0;
Edge nowEdge;
for (i=1; i<n; i++) {
for (int j=0; j<m; j++) {
nowEdge = edges[j];
if (distance[nowEdge.u] != Integer.MAX_VALUE &&
distance[nowEdge.v] > distance[nowEdge.u] + nowEdge.w) {
distance[nowEdge.v] = distance[nowEdge.u] + nowEdge.w;
}
}
}
boolean cycle = false;
for (i=0; i<m; i++) {
nowEdge = edges[i];
if (distance[nowEdge.u] != Integer.MAX_VALUE &&
distance[nowEdge.v] > distance[nowEdge.u] + nowEdge.w) {
cycle = true; //음수 사이클 존재
}
}
StringBuilder sb = new StringBuilder();
if (cycle) {
sb.append(-1);
} else {
for (i=2; i<n+1; i++) {
if (distance[i] != Integer.MAX_VALUE) {
sb.append(distance[i]).append('\n');
} else {
sb.append(-1).append('\n');
}
}
}
System.out.println(sb);
}
static class Edge {
int u;
int v;
int w;
public Edge(int u, int v, int w) {
this.u = u;
this.v = v;
this.w = w;
}
}
}
'Algorithm > Algorithm 문제' 카테고리의 다른 글
백준_11404 플로이드 (플로이드-워셜) (1) | 2024.02.27 |
---|---|
백준_1219 오민식의 고민 (벨만-포드) (1) | 2024.02.26 |
백준_1854 k번째 최단경로 찾기 (다익스트라) (0) | 2024.02.24 |
백준_1916 최소비용 구하기 (다익스트라) (0) | 2024.02.23 |
백준_1753 최단경로 (다익스트라) (0) | 2024.02.22 |
@kjyyjk :: 녕의 학습 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!