일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- c
- Spotify Api
- SECS
- CS
- modern c++
- SWEA
- regression
- 백준
- Spring
- python
- SECS-II
- Gem
- 스포티파이
- Computer Science
- 프로그래머스
- java
- 자바
- 회귀
- SECS/GEM
- Spring JPA
- spotify
- MYSQL
- 회원가입
- SW Expert Academy
- Baekjoon
- programmers
- 비트겟
- C++
- 파이썬
- spring boot
Archives
- Today
- Total
비버놀로지
[BAEKJOON 백준] 1753 최단경로 본문
728x90
방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오. 단, 모든 간선의 가중치는 10 이하의 자연수이다.
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가 매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을 나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다. u와 v는 서로 다르며 w는 10 이하의 자연수이다. 서로 다른 두 정점 사이에 여러 개의 간선이 존재할 수도 있음에 유의한다.
첫째 줄부터 V개의 줄에 걸쳐, i번째 줄에 i번 정점으로의 최단 경로의 경로값을 출력한다. 시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.
arraylist를 이용을 해서 각 각의 정점에서 간선과 가중치를 가지는 Point를 가진 arraylist를 인자로 가진다.
u라는 정점에 v라는 정점이 W라는 가중치를 가진 Point를 넣어준다.
시작점의 최단 경로는 0으로 해주고, 시작점이 1인 경우, 2로가는 최단 경로를 구해야 한다.
먼저 1에 들어가있는 arrlist를 확인해서 간선이 있는지 확인을 하고 있다면 최단거리를 전부 넣어준다.
그렇게 각 각의 최단거리를 만들어준 후 출력하게 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
static class Point {
int v, w;
public Point(int v, int w) {
super();
this.v = v;
this.w = w;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
int V = Integer.parseInt(st.nextToken());
int E = Integer.parseInt(st.nextToken());
int start = Integer.parseInt(bf.readLine());
int[] distance = new int[V + 1];
boolean[] visited = new boolean[V + 1];
int INFINITY = Integer.MAX_VALUE;
List<Point>[] arrlist = new ArrayList[V + 1];
for (int i = 0; i <= V; i++) {
arrlist[i] = new ArrayList<Point>();
}
for (int i = 0; i < E; i++) {
st = new StringTokenizer(bf.readLine(), " ");
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
arrlist[u].add(new Point(v, w));
}
Arrays.fill(distance, INFINITY);
distance[start] = 0;
int min = 0, current = 0;
for (int i = 1; i <= V; i++) {
min = INFINITY;
// 1단계 : 방문하지 않은 정점들 중 출발지에서 자신까지 오는 비용이 최단인 정점을 경유지로 선택
for (int j = 1; j <= V; j++) {
if (!visited[j] && min > distance[j]) {
min = distance[j];
current = j;
}
}
visited[current] = true;
// 2단계 : 선택된 current 정점을 경유지로 해서 아직 방문하지 않은 다른 정점으로의 최단거리 비용 계산하여 유리하면 update
if (!arrlist[current].isEmpty()) {
for (int j2 = 0; j2 < arrlist[current].size(); j2++) {
if (!visited[arrlist[current].get(j2).v]
&& distance[arrlist[current].get(j2).v] > min + arrlist[current].get(j2).w) {
distance[arrlist[current].get(j2).v] = min + arrlist[current].get(j2).w;
}
}
}
}
for (int i = 1; i <= V; i++) {
if (distance[i] == INFINITY) {
System.out.println("INF");
} else {
System.out.println(distance[i]);
}
}
}
}
728x90
'ALGORITM > JAVA' 카테고리의 다른 글
[BAEKJOON 백준] 1987 알파벳 (0) | 2021.01.13 |
---|---|
[BAEKJOON 백준] 1931 회의실 배정 (0) | 2021.01.13 |
[BAEKJOON 백준] 1715 카드 정렬하기 (0) | 2021.01.12 |
[BAEKJOON 백준] 1697 숨바꼭질 (0) | 2021.01.12 |
[BAEKJOON 백준] 1613 역사 (0) | 2021.01.12 |
Comments