• 문제 링크
1865번: 웜홀
첫 번째 줄에는 테스트케이스의 개수 TC(1 ≤ TC ≤ 5)가 주어진다. 그리고 두 번째 줄부터 TC개의 테스트케이스가 차례로 주어지는데 각 테스트케이스의 첫 번째 줄에는 지점의 수 N(1 ≤ N ≤ 500),
www.acmicpc.net
• 풀이 과정
[백준] 11657 타임머신 - Graph Theory / Java
• 문제 링크 11657번: 타임머신 첫째 줄에 도시의 개수 N (1 ≤ N ≤ 500), 버스 노선의 개수 M (1 ≤ M ≤ 6,000)이 주어진다. 둘째 줄부터 M개의 줄에는 버스 노선의 정보 A, B, C (1 ≤ A, B ≤ N, -10,000..
graycode.tistory.com
위의 문제와 유사한 벨만 포드 알고리즘 문제이다.
다만 이 문제에선 테스트 케이스가 여러 개 주어지고,
간선의 개수 m 과 음의 가중치 간선의 개수 w 가 주어지며 m 은 무향 그래프로 입력받아 저장한다.
또한 문제에서 특정 시작점을 명시하지 않았고,
어떤 노드에서 시작을 하더라도 음의 사이클의 존재 유무만 파악하면 되므로
최단 거리를 구할 때 사용하는 inf 값을 생성하지도, 비교하지도 않는다.
따라서 dist 배열 또한 0으로 초기화해도 무방하다.
이렇게 n 번째 순회에서 음의 사이클의 존재 유무를 파악하여
반환한 boolean 값에 따라 "YES" 또는 "NO" 를 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static int n, m, w;
static int[] dist;
static List<Edge> list;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int tc = Integer.parseInt(br.readLine());
while (tc-- > 0) {
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
dist = new int[n + 1];
list = new ArrayList<>();
for (int i = 0; i < m + w; i++) {
st = new StringTokenizer(br.readLine());
int src = Integer.parseInt(st.nextToken());
int dest = Integer.parseInt(st.nextToken());
int weight = Integer.parseInt(st.nextToken());
if (i < m) {
list.add(new Edge(src, dest, weight));
list.add(new Edge(dest, src, weight));
} else
list.add(new Edge(src, dest, weight * -1));
}
bw.write((bellmanFord() ? "YES" : "NO") + "\n");
}
bw.flush();
}
private static boolean bellmanFord() {
for (int i = 1; i <= n; i++) {
for (Edge edge : list) {
if (dist[edge.dest] > dist[edge.src] + edge.weight) {
dist[edge.dest] = dist[edge.src] + edge.weight;
if (i == n)
return true;
}
}
}
return false;
}
private static class Edge {
int src, dest, weight;
public Edge(int src, int dest, int weight) {
this.src = src;
this.dest = dest;
this.weight = weight;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1753 최단경로 - Graph Theory / Java (0) | 2022.08.20 |
---|---|
[백준] 1916 최소비용 구하기 - Graph Theory / Java (0) | 2022.08.19 |
[백준] 11657 타임머신 - Graph Theory / Java (0) | 2022.08.17 |
[백준] 1197 최소 스패닝 트리 - Graph Theory / Java (0) | 2022.08.16 |
[백준] 1922 네트워크 연결 - Graph Theory / Java (0) | 2022.08.15 |
댓글