Dijkstra
์ ์
- ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ํ ์ ์ ์ผ๋ก๋ถํฐ ๋ค๋ฅธ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
ํน์ง
- ์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์์ ๊ฐ๋ฅ
- ๋งค๋ฒ ์ต๋จ ๊ฑฐ๋ฆฌ์ธ ์ ์ ์ ํ
- ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ฉฐ, ์๊ฐ๋ณต์ก๋๋ O(E logV)
์ฝ๋
๊ตฌํ
public void dijkstra() {
Queue<Node> queue = new PriorityQueue<>();
queue.add(new Node(start, 0));
dist[start] = 0;
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (dist[cur.v] < cur.w) {
continue;
}
for (Node next : graph.get(cur.v)) {
if (dist[next.v] > dist[cur.v] + next.w) {
dist[next.v] = dist[cur.v] + next.w;
queue.add(new Node(next.v, dist[next.v]));
}
}
}
}
public class Node implements Comparable<Node> {
int v;
int w;
public Node(int v, int w) {
this.v = v;
this.w = w;
}
@Override
public int compareTo(Node o) {
return this.w - o.w;
}
}
๊ฒฝ๋ก ์ถ์
public void dijkstra() {
Queue<Node> queue = new PriorityQueue<>();
queue.add(new Node(start, 0));
int[] prev = new int[n + 1];
dist[start] = 0;
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (dist[cur.v] < cur.w) {
continue;
}
for (Node next : graph.get(cur.v)) {
if (dist[next.v] > dist[cur.v] + next.w) {
dist[next.v] = dist[cur.v] + next.w;
prev[next.v] = cur.v;
queue.add(new Node(next.v, dist[next.v]));
}
}
}
}
public class Node implements Comparable<Node> {
int v;
int w;
public Node(int v, int w) {
this.v = v;
this.w = w;
}
@Override
public int compareTo(Node o) {
return this.w - o.w;
}
}
ํน์ ์ ์ ์ ๋ฐ๋์ ํต๊ณผํ๋ ์ต๋จ ๊ฒฝ๋ก
public void solve() {
int[] d1 = dijkstra(1);
int[] d2 = dijkstra(v1);
int[] d3 = dijkstra(v2);
}
public int[] dijkstra(int start) {
Queue<Node> queue = new PriorityQueue<>();
queue.add(new Node(start, 0));
int[] dist = new int[N + 1];
Arrays.fill(dist, 987654321);
dist[start] = 0;
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (dist[cur.v] < cur.w) {
continue;
}
for (Node next : graph.get(cur.v)) {
if (dist[next.v] > dist[cur.v] + next.w) {
dist[next.v] = dist[cur.v] + next.w;
queue.add(new Node(next.v, dist[next.v]));
}
}
}
return dist;
}
public class Node implements Comparable<Node> {
int v;
int w;
public Node(int v, int w) {
this.v = v;
this.w = w;
}
@Override
public int compareTo(Node o) {
return this.w - o.w;
}
}