๋ค์ต์คํธ๋ผ ๋๋ถํฐ์๋๊ฐ์..? ์ ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ํฌ๊ธฐํ ๊ฒ...
๊ทธ๋ํ์ ์ฐ๊ฒฐ๋ ๊ธฐ๋ฒ ์ค์ ๊ฐ์ฅ ๊ธฐ์ด๋ผ๊ณ ํ๋๋ฐ, ์ฒ์ ๋ค์ต์คํธ๋ผ ๋ฌธ์ ํ ๋๋ ์ดํด ์ ๊ฐ์ ๋ฏธ์น๋ ์ค ์์๋ค.
๋์ฒด ์ด๋ค ์ฌ๋์ด๊ธธ๋ ์ด๋ฐ ์๊ฐ์ ํ๋ ๊ฑด์ง๋ ๋๋ฌด ์ ๊ธฐํ๊ณ .
๊ทผ๋ฐ ๊ฑฐ์ 3๋ ๋ง์ ๋ค์ต์คํธ๋ผ ๋ค์ ๋ณด๋๋ฐ ์ง๊ธ๋ ์ดํด๊ฐ ์ ๊ฐ๋ค ํํณํํ
๊ฐ๋ ๋์ง์ด ๋ณด๋ ค๊ณ ์๋ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ํ๋ค.
๋ค์ต์คํธ๋ผ๋ ์์์ ์ด ์ ํด์ ธ์๊ณ , ํด๋น ์์์ ์์ ์ต๋จ ๊ฒฝ๋ก๋ก ๋ชฉํ์ ์ ๋๋ฌํ๋ ๋ฌธ์ ์์ ์ฌ์ฉํ ์ ์๋ค.
์ผ๋จ ์์์ ๊ณผ ์ฐ๊ฒฐ๋ Node๋ค์ ์ฐพ์์ ๊ทธ Node๋ค๊ณผ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด์ ๋ฃ๊ณ ,
๋ค์ ๊ทธ Node์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ Node๋ค์ ์ฐพ์์ ๊ทธ Node๋ค๊ณผ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ํ๋์ ๋ฐ๋ณตํ๋ค.
๋๋ถ๋ถ์ ๋ฌธ์ ๋ค์ ๋ ธ๋์ ๊ฐ์ ์ ๊ฐ์๋ฅผ ๋ช์ญ๋ง๊ฐ์ฉ ์ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ํธ๋ ๊ฒ ๊ดํ ๋ง์์ด ํธํ๋ค.
1. Node ํด๋ผ์ค
- Edge๋ผ๊ณ ๋ ๋ง์ด ํ๋ค. ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค.
//์ ์ ์ ๊ดํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ Node Class
static class Node
{
int end; //์ฐ๊ฒฐ๋ ๋
ธ๋
int dist; //๊ฑฐ๋ฆฌ
Node link;
public Node(int end, int dist)
{
super();
this.end = end;
this.dist = dist;
}
}
2. Vertex ํด๋ผ์ค
//PriorityQueue ์ฌ์ฉ์, ์ฐ์ ์์๋ฅผ ์ง์ ํด์ฃผ๊ธฐ ์ํ ํด๋ผ์ค
//compareTo ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํ์ฌ, ๊ฑฐ๋ฆฌ๊ฐ ์งง์ Vertex๊ฐ ์ฐ์ ์์๋ฅผ ์ฐจ์งํ๋๋ก ํ๋ค
static class Vertex implements Comparable<Vertex>
{
int end;
int dist;
public Vertex(int end, int dist)
{
super();
this.end = end;
this.dist = dist;
}
@Override
public int compareTo(Vertex o) {
return this.dist-o.dist;
}
}
3. main ๋ฉ์๋
์ค ๋๋ฆ ์ ์ ๋ฆฌํด๋จ์๋๋ฐ...?
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().trim().split(" ");
StringBuilder sb = new StringBuilder();
int V = Integer.parseInt(str[0]); //์ ์ (Node)
int E = Integer.parseInt(str[1]);
int K = Integer.parseInt(br.readLine().trim());
Node[] node = new Node[V+1];
Node newNode;
int start, end, weight;
//1. ๊ทธ๋ํ ์์ฑ
for(int e=0;e<E;e++) {
str = br.readLine().trim().split(" ");
start = Integer.parseInt(str[0]);
end = Integer.parseInt(str[1]);
weight = Integer.parseInt(str[2]);
//์๋ก์ด ์ ์ ์์ฑ
newNode = new Node(end, weight);
//node[start]์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ธฐ์กด ๋
ธ๋์ ์ฃผ์๋ฅผ link์ ๋ด์
newNode.link = node[start];
//node[start]์ ์๋ก ๋ง๋ newNode์ ์ฃผ์ ๋ด์
node[start] = newNode;
}
//2. ๊ฑฐ๋ฆฌ ๋ฐฐ์ด, ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฐฐ์ด
//dist๋ฐฐ์ด : ์์์ (K)์์ ๊ฐ ๋
ธ๋๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์ ๋ฐฐ์ด
//์ฐ์ ์ MAX_VALUE๋ก ์ฑ์์ค ๋ค์ ๋ ์งง์ ๊ฑฐ๋ฆฌ๋ก ๊ฐฑ์ ํ๋ค
int[] dist = new int[V+1];
Arrays.fill(dist, Integer.MAX_VALUE);
boolean[] visited = new boolean[V+1];
//3. ์์์ ์ฒดํฌ
dist[K] = 0;
PriorityQueue<Vertex> que = new PriorityQueue<Vertex>();
que.offer(new Vertex(K,0));
Vertex vertex;
Node currNode;
int pos, min;
while(!que.isEmpty()) {
//2-2-c)์ ์ด์ด์ : ์ด๋ ์ฐ์ ์์ ํ์ด๊ธฐ ๋๋ฌธ์, Vertex(2,2)๊ฐ ๋จผ์ ๋ฝํ๋ค.
vertex = que.poll();
//ํ์ฌ์ ์์น
pos = vertex.start;
//ํ์ฌ ์์์ ์์ pos๊น์ง์ ๊ฑฐ๋ฆฌ์ค ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๋ด๊ฒจ์๋ค
min = vertex.weight;
if(visited[pos]) continue;
visited[pos] = true;
//1) ์์์ (=1์ด๋ผ๊ณ ๊ฐ์ )์ ๊ธฐ์ค์ผ๋ก ์๊ฐํด๋ณด๋ฉด
//currNode์ node[1]์ ๋ถ์ด์๋ ์ฒซ ๋ฒ์งธ ๋
ธ๋๋ฅผ ๋ด์ ๊ฒ
currNode = node[pos];
//2-1-a) ๋
ธ๋ 1์๋ ๋
ธ๋ 2์ ๋
ธ๋ 3์ด ์ฐ๊ฒฐ๋์ด ์๋๋ฐ, ๋์ค์ ์
๋ ฅ๋ ๋
ธ๋๊ฐ
//๋จผ์ ์
๋ ฅ๋ ๋
ธ๋์ ์์ ๋ผ์ด๋ค๊ฒ ๊ตฌํํ์ผ๋ฏ๋ก ์ผ๋จ currNode์๋
//๋
ธ๋ 3์ ์ฃผ์๊ฐ ๋ด๊ฒจ ์๋ค.
//2-3-a) ๋
ธ๋ 2์ ๋ค์์ ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ ์์ด currNode๋ Null์ด ๋๋ค.
while(currNode!=null) {
//2-1-b) next์๋ 3์ ๊ฐ์ด ์
๋ ฅ๋์ด ์๊ณ , nextWeight์๋ ๊ฑฐ๋ฆฌ 3
//2-2-a) ์ด์ next์๋ 2์ ๊ฐ์ด ์
๋ ฅ๋์ด ์๊ณ , nextWeight์๋ ๊ฑฐ๋ฆฌ 2
int next = currNode.connNode;
int nextWeight = currNode.weight;
//2-1-c) ํ๋ฒ๋ ๋
ธ๋ 3์ ๋ฐฉ๋ฌธํ ์ ์ด ์๊ณ , dist[3]์๋ ํ์ฌ MAX_VALUE๊ฐ ๋ด๊ฒจ์๋ค
//2-2-b) ํ๋ฒ๋ ๋
ธ๋ 2๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๊ณ , dist[2]์๋ ํ์ฌ MAX_VALUE๊ฐ ๋ด๊ฒจ์๋ค
if(!visited[next] && min+nextWeight < dist[next] ) {
dist[next] = min+nextWeight;
//2-1-d) ์ด๋ ๊ฒ ๋๋ฉด, que์๋ Vertex(3,3)์ด ๋ค์ด๊ฐ๋ค
//2-2-c) ์ด๋ ๊ฒ ๋๋ฉด, que์๋ Vertex(2,2)๊ฐ ๋ค์ด๊ฐ๋ค.
//์ด๋ ์ค์ํ ์ ์, que๊ฐ ์ฐ์ ์์ ํ์ด๋ฉฐ, Vertex ํด๋์ค์์
//weight๊ฐ ์ ์ ๊ฐ์ด ์ฐ์ ์์๊ฐ ๊ฐ์ง๋๋ก ๊ตฌํํ์ผ๋ฏ๋ก ์์ ์์ผ๋ก๋
//Vertex(3,3)์ ๋จผ์ ๋ฃ์ด๋, ๋ค์ ์์์์ que.poll()์ ํ ๋์๋
//Vertex(2,2)๊ฐ ๋จผ์ ๋์จ๋ค.
que.offer(new Vertex(next,dist[next]));
}
//2-1-e) ๋
ธ๋ 3์๋ ๋
ธ๋2์ ์ฃผ์๊ฐ ๋ด๊ฒจ์๋ค.์ด์ currNode์ ๋
ธ๋2๊ฐ ๋ด๊ฒจ์๋๋ก ํ๋ค.
//2-2-d) ๋
ธ๋ 2 ๋ค์์๋ ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ ์์ผ๋ฏ๋ก currNode = null์ด ๋๋ค
currNode = currNode.link;
}
}
for(int i=1;i<=V;i++) {
if(dist[i]==Integer.MAX_VALUE) sb.append("INF\n");
else sb.append(dist[i]+"\n");
}
System.out.println(sb.toString().trim());
}
๋ด๊ฐ ์ฒ์ ๋ค์ต์คํธ๋ผ๋ฅผ ๋ฐฐ์ธ ๋๋ ๊ทธ๋ฌ๊ณ , ์ง๊ธ๋ ๊ฐํน ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ ์ค ํ๋๋ visited
๋ฐฐ์ด๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์ด์ ์๋ค. ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ฉด ๋ ์งง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋์น๋ ๊ฒ ์๋๊ฐ ์ถ์๋ค.
์๋ฅผ ๋ค์ด, ๋ ธ๋ 1๊ณผ ๋ ธ๋ 5๊ฐ ์๋์ฒ๋ผ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ํ์.
๋ ธ๋ 1 → ๋ ธ๋ 5๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ : 5
๋ ธ๋ 5 → ๋ ธ๋ 1๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ : 2
๋ง์ฝ ์์์ ์ด ๋
ธ๋ 1์ด๋ผ์ ์ผ๋จ visited[1] = true
์ฒ๋ฆฌ๊ฐ ๋์์ ๊ฑฐ๊ณ , que
์๋ Vertex(5,5)
๊ฐ ๋ค์ด๊ฐ ํ
๋ฐ
que.poll()
ํด์ Vertex(5,5)
๋ฅผ ๋ฝ์์ ๋, ์ด๋ฏธ ๋
ธ๋ 1์ visited[1]=true
์ฒ๋ฆฌ ๋์ด ์์ด์, ํจ์ฌ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ 2๊ฐ ๊ณ ๋ ค๋์ง ์๋๋ค.
๊ทผ๋ฐ ๋ด๊ฐ ์ ์ด์ ๋ค์ต์คํธ๋ผ์ ์ ์ ๋ฅผ ๋ชจ๋ฅด๊ณ ์์๊ธฐ ๋๋ฌธ์ ๋ ์๋ฌธ์ด์๋ค.
๋ค์ต์คํธ๋ผ๋ ๋ฐฉํฅ ๊ทธ๋ํ๋ผ๋ ์ ์ ๋ฅผ ๊น ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฒ์ด๋ค. ์ฆ, ๋ ธ๋ 1→๋ ธ๋ 5์ ๋ ธ๋ 5→๋ ธ๋ 1์ ์์ฐํ ๋ค๋ฅธ ์ผ์ด์ค๋ค. ๋ ธ๋ 5์์ ๋ ธ๋ 1๋ก ๊ฐ ์ ์๋ค๊ณ ํด์ ํญ์ ๋ ธ๋ 1์์ ๋ ธ๋ 5๋ก ๊ฐ ์ ์๋ ๊ฑด ์๋๋ค.
์์ ๊ฐ์ ์ํฉ์์ ๋ ธ๋ 1์์ ๋ ธ๋ 5๋ก ๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์, ๋ ธ๋ 1์์ ๋ ธ๋ 5๋ก ๋ฐ๋ก ๊ฐ๋ ๊ฒ ๋ฟ์ด๋ค.
์ ๋ฆฌํ๋ฉด, ๋ ธ๋ A, B, C๊ฐ ์๊ณ , A→B๋ก ๊ฐ๋ ๊ฐ์ 1, A→C๋ก ๊ฐ๋ ๊ฐ์ , B→C๋ก ๊ฐ๋ ๊ฐ์ 3๊ฐ๊ฐ ์์ ๋, ๋ ธ๋ A์์ ๋ ธ๋ C๊น์ง ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ฐพ๋๋ค.
- ๋
ธ๋ A์์ ๋
ธ๋ C๊น์ง์ ํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ(dist[]
๋ฐฐ์ด์ ๊ฐ)
- ๋ ธ๋ A์์ ๋ ธ๋ B๊น์ง ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ + ๋ ธ๋ B์์ ๋ ธ๋ C๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ
์ ๋ ๊ฐ์ ๊ฑฐ๋ฆฌ ์ค ๊ฐ์ฅ ์งง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ๋ ๊ฒ
๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ํ์.
A→B๋ก ๊ฐ๋ ๊ฐ์ : 1
A→C๋ก ๊ฐ๋ ๊ฐ์ : 10
B→C๋ก ๊ฐ๋ ๊ฐ์ : 2
์์ ๋
ธ๋์ธ A์์ ์์ํ ๋, dist[B] = 1
, dist[C] = 10
์ผ๋ก ๊ฐฑ์ ๋ ๊ฒ์ด๊ณ , ์ด์ ๋
ธ๋ B์ ๋
ธ๋ C๋ฅผ ์ฐจ๋ก๋ก ๋ค๋ฅผํ
๋ฐ
๋
ธ๋ B์์ ๋
ธ๋ C๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ = 2์ด๋ฏ๋ก dist[C] = dist[B]+2 = 1+2 = 3
์ผ๋ก ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐฑ์ ๋๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฐ] ๋ฐฑ์ค 1697 - ์จ๋ฐ๊ผญ์ง (1) | 2020.12.12 |
---|---|
[์๋ฐ] ๋ฐฑ์ค 7576 - ํ ๋งํ (0) | 2020.12.12 |
[์๋ฐ] ๋ฐฑ์ค 1012 - ์ ๊ธฐ๋ ๋ฐฐ์ถ (0) | 2020.12.06 |
[์๋ฐ] ๋ฐฑ์ค 2667 - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2020.12.06 |
[์๋ฐ] ๋ฐฑ์ค 2606 - ๋ฐ์ด๋ฌ์ค (0) | 2020.12.05 |