DP(๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)๋ฅผ ํ์ฉํ ๋ํ์ ์ธ ์ต๋จ ๊ฒฝ๋ก ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํ๋์ ์ ์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ค. ์ต๋จ ๊ฑฐ๋ฆฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ต๋จ ๊ฑฐ๋ฆฌ๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ ์์ ๋ฌธ์ ๊ฐ ํฐ ๋ฌธ์ ์ ๋ถ๋ถ ์งํฉ์ ์ํด์๋ค๊ณ ๋ณผ ์ ์๋ค. ํ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋ ๊ทธ ์ด์ ๊น์ง ๊ตฌํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ํน์ง์ด ์๋ค.
๐น๏ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๊ณผ์
- ์ถ๋ฐ ๋ ธ๋ ์ค์
- ์ถ๋ฐ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ ๋ ธ๋์ ์ต์ ๋น์ฉ ์ ์ฅ
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋ ์ ํ
- ํด๋น ๋ ธ๋ ๊ฑฐ์ณ์ ํน์ ํ ๋ ธ๋๋ก ๊ฐ๋ ๊ฒฝ์ฐ ๊ณ ๋ คํ์ฌ ์ต์ ๋น์ฉ ๊ฐฑ์
- 3๏ธโฃ, 4๏ธโฃ๋ฒ ๋ฐ๋ณต
๊ธฐ๋ณธ์ ์ธ ๋ค์ต์คํธ๋ผ - ์ ํํ์
public class Main{
static int INF = 1000000000; // ์ฝ 10์ต
static int N = 6;
// ์ ์ฒด ๊ทธ๋ํ ์ด๊ธฐํ
static int graph[6][6]={0,2,5,1,INF,INF},
{2,0,3,2,INF,INF},
{5,3,0,3,1,5},
{1,2,3,0,1,INF},
{INF,INF,1,1,0,2},
{INF,INF,5,INF,2,0}};
static boolean visit[6]; // ๋ฐฉ๋ฌธํ ๋
ธ๋
static int d[6]; // ์ต๋จ ๊ฑฐ๋ฆฌ
public static void main(String[] args){
dijkstra(0);
for(int i=0; i<N; i++){
System.out.print("%d ", d[i]);
}
}
// ๊ฐ์ฅ ์ต์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๋ ์ ์ ๋ฐํ
static int getSmallIndex(){
int min = INF;
int index=0;
for(int i=0; i<N; i++){
if(d[i]<min && !visit[i]){
min = d[i];
index = i;
}
}
return index;
}
// ๋ค์ต์คํธ๋ผ ์ํํ๋ ํจ์
static void dijkstra(int start){
for(int i=0; i<N; i++){
d[i] = graph[start][i];
}
visit[start] = true;
for(int i=0; i<N-2; i++){
int current = getSmallIndex();
visit[current]=true;
for(int j=0; j<N; j++){
if(!visit[j]){
if(d[current]+graph[current][j] < d[j]){
d[j] = d[current]+graph[current][j];
}
}
}
}
}
}
โก๏ธ ์ ์ ์ ๊ฐ์๊ฐ ๋ง์๋ฐ ๊ฐ์ ์ ์ ์ ๋ ๋นํจ์จ์ ์ผ๋ก ์๋ํ๋ฏ๋ก ๊ถ์ฅ X
๋ค์ต์คํธ๋ผ - ์ฐ์ ์์ ํ
/**
* ๋ค์ต์คํธ๋ผ ๊ธฐ๋ณธ ๋ฌธ์
*/
public class BOJ_1753_์ต๋จ๊ฒฝ๋ก {
static int V, E, K;
static ArrayList<Node>[] arr;
static int[] d;
static boolean[] visit;
static int INF = 100;
static class Node implements Comparable<Node>{
int v, w;
public Node(int v, int w) {
this.v = v;
this.w = w;
}
@Override
public int compareTo(Node o) {
return Integer.compare(this.w, o.w);
}
}
static void dijkstra(int start){
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(start, 0));
d[start] = 0;
while (!pq.isEmpty()) {
Node now = pq.poll();
if (!visit[now.v]) {
visit[now.v] = true;
}
for(int i=0; i<arr[now.v].size(); i++){
Node next = arr[now.v].get(i);
if (!visit[next.v] && d[next.v] > now.w + next.w) {
d[next.v] = now.w + next.w;
pq.add(new Node(next.v, d[next.v]));
}
}
}
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
V = Integer.parseInt(st.nextToken());
E = Integer.parseInt(st.nextToken());
K = Integer.parseInt(br.readLine());
arr = new ArrayList[V + 1];
d = new int[V + 1];
visit = new boolean[V + 1];
Arrays.fill(d, INF);
for(int i=1; i<=V; i++){
arr[i] = new ArrayList<>();
}
for(int i=1; i<=E; i++){
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int w = Integer.parseInt(st.nextToken());
arr[u].add(new Node(v, w));
}
dijkstra(K);
for (int i = 1; i <=V; i++) {
System.out.println(d[i] == 100 ? "INF" : d[i]);
}
}
}
'์๊ณ ๋ฆฌ์ฆ > ๐๏ธ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Bellman-Ford (๋ฒจ๋ง-ํฌ๋) (0) | 2023.09.08 |
---|---|
LCA (์ต์๊ณตํต์กฐ์) (0) | 2023.09.04 |
Binary Search (์ด๋ถํ์) (0) | 2023.09.01 |
Floyd-Warshall (ํ๋ก์ด๋ ์์ ) (0) | 2023.08.29 |
Union Find (์ ๋์จ ํ์ธ๋) (0) | 2023.08.29 |