1. ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋?
์์์ธ ๊ฐ์ค์น๊ฐ ์กด์ฌํ๋ ๊ทธ๋ํ
์์๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๊ฒ ํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ.
- 1๏ธโฃ
ONE TO ALL ์๊ณ ๋ฆฌ์ฆ
: ์์์ ์ ๊ณ ๋ฅด๋ฉด, ํด๋น ์ ์ ์์ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์๋ค. - 2๏ธโฃ
์์ ๊ฐ์ค์น๊ฐ ์์ด๋ ๊ด์ฐฎ์
: ๋ค์ต์คํธ๋ผ๋ ์๋์ง? - 3๏ธโฃ
์์ ์ฌ์ดํด์ด ์กด์ฌํ๋์ง๋ ํ์ธ ๊ฐ๋ฅ
: ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด, ์ฌ์ค ํ๋ ์ด์์ ์ ์ ์ผ๋ก์ ์ต๋จ ๊ฒฝ๋ก๊ฐ $- \infty $๊ฐ ๋๊ธฐ ๋๋ฌธ์, ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ ๋ฌด์๋ฏธํด์ง. ๋ฐ๋ผ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ ๋ฌด์๋ฏธํ์ง ์ฌ๋ถ๋ ํ์ ๊ฐ๋ฅ!
์์ ์ฌ์ดํด
๊ฐ์ค์น ๊ทธ๋ํ์์ ์ ์ A์์ ์์ํด์ A๋ก ๋์์๋๋ฐ ๊ฐ์ค์น์ ํฉ์ด ์์์ธ ๊ฒฝ์ฐ, ํด๋น ์ฌ์ดํด์ ์์ ์ฌ์ดํด์ด๋ผ๊ณ ํ๋ค.
ํด๋น ์์์์๋ ์ฌ์ดํด์ ๋์๋ก ์ถ๋ฐ์ง์์ A
,B
,C
๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ ์งง์์ง๋ค. ๋ฐ๋ผ์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค.
2. ๋ฒจ๋งํฌ๋์ ๊ณผ์
์ ์ ์ ์๋ฅผ V
, ๊ฐ์ ์ ์๋ฅผ E
๋ผ๊ณ ํ์.
- 0๏ธโฃ
์ฌ์ ์ธํ
- ์์ ์ ์ ์ ํ๊ธฐ
- ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด(์ดํ dist) ๋ง๋ค๊ธฐ (
index = ๋์ฐฉ์ ์
,value = ์์ ์ ์ ์์ ํด๋น ์ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ
) - ๊ทธ๋ํ๋ฅผ ๊ฐ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๊ธฐ
<์ถ๋ฐ ์ ์ , ๋์ฐฉ ์ ์ , ๊ฐ์ ๊ฐ์ค์น>
- 1๏ธโฃ $V-1$ ๋ฒ ๋๋ฉด์, ๋ชจ๋ ๊ฐ์ ์ ๋ํ์ฌ ๋ค์์ ๋ฐ๋ณตํ๋ค.
- ํ์ฌ ๋ณด๊ณ ์๋ ๊ฐ์ ์ ์ ๋ณด๋ฅผ
<start=A, end=B, weight=C>
๋ผ๊ณ ํด๋ณด์. - ๋ง์ฝ
dist[A]
= $ \infty$ ์ด๋ฉด ๋ฐ๋ก ๋ค๋ฅธ ๊ฐ์ ์ผ๋ก ๋์ด๊ฐ๋ค. dist[A]
$\neq \infty$ ์ผ ์,dists[B] > dist[A] + C
๋ฅผ ์ฑ๋ฆฝํ๋ค๋ฉด,dist[B]
๋ฅผdist[A] + C
๋ก ๊ฐฑ์ ํ๋ค. (์ด ๊ฐฑ์ ๊ณผ์ ์์ํ
๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
- ํ์ฌ ๋ณด๊ณ ์๋ ๊ฐ์ ์ ์ ๋ณด๋ฅผ
- 2๏ธโฃ ๋ง์ง๋ง์ผ๋ก ํ ๋ฒ ๋ 1๏ธโฃ์ ์ํํด๋ณธ๋ค. ์ดํ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋ ์์์ง ๋ ์์ด ํ๋๋ผ๋ ์กด์ฌํ๋ฉด, ํด๋น ๊ทธ๋ํ์๋ ์์ ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๋ค.
(1) 1๏ธโฃ์ V-1๋ฒ๋ง ๋ฐ๋ณตํ๋ ์ด์
์ ์ ์ ์๋ฅผ V
๊ฐ๋ผ ํ ๋, ์์์ ์ ์ A
์์ B
๋ก ๊ฐ๋ ๊ฒฝ๋ก์์ ์กด์ฌํ ์ ์๋ ๊ฐ์ ์ ์ต๋ ๊ฐ์๋ V-1
๊ฐ ์ด๋ค. ๋ฒจ๋งํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ 1๏ธโฃ ์ ๋ฐ๋ณต์ ์ํํ ๋๋ง๋ค, ๊ฐ์ ์ ํ๋์ฉ ๋ ํ์ฉํ๋ฉฐ, ์ ์ ์ฌ์ด์ ๋น์ฉ์ ์ํํ๋ค. ๋ฐ๋ผ์ V-1
๋ฒ์ ๊ณ์ฐ ๋ฐ๋ณต๋ง ์ ์๋ฏธํ ๊ฐ์ค์น ์ํ๋ฅผ ์ผ์ผํจ๋ค. V๋ฒ์งธ ๋ถํฐ๋ ์์ ์ฌ์ดํด์ด ์์ง ์๋ ํ, ๊ฐ์ค์น ๊ฐฑ์ ์ด ๋์ง ์๋๋ค.
(2) ๊ทธ๋ฆผ์ผ๋ก ์ดํดํ๊ธฐโจ
๋ฒจ๋งํฌ๋๋ ํ๋ฒ์ ๋ฐ๋ณต๋ง๋ค, ๊ฐ์ ์ด ์ ์ง์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ํ๋๋ ๊ณผ์ ์ ๋ณด๋ ๊ฒ์ด ์ค์ํ๋ฐ, ๊ทธ๋ฆผ์ผ๋ก ํ๋ํ๋ ๊ทธ๋ฆฌ๊ธฐ๊ฐ ๊ท์ฐฎ์์ ์๋ตํ๊ฒ ๋ค. ํด๋น ๊ทธ๋ฆผ์ ์ ๋ง ์ ํํํ์ ๋ธ๋ก๊ทธ๋ฅผ ๋๋ด๋๋ฆฌ๋, ๋ ์๋ถ๋ค์ ํ ๋ฒ๋ณด๊ณ ์ค์๊ธธ ๋ฐ๋๋ค.
3. ๋ฒจ๋งํฌ๋์ ๊ตฌํ
์์ ์ ์ ์ด ๋ชจ์ธ ๋ฐฐ์ด์ a[]
, ๋์ฐฉ ์ ์ ์ด ๋ชจ์ธ ๋ฐฐ์ด์ b []
, ๊ฐ์ ์ด ๋ชจ์ธ ๋ฐฐ์ด์ c []
๋ผ๊ณ ํ ๋, i ๋ฒ์งธ
๊ฐ๋ค์ ํ๋์ ๊ฐ์ ์ ๋ํ๋ธ๋ค๊ณ ํ์. ์ฆ a[i],b[i],c[i]
๋ a[i]
์์ b[i]
๋ก ๊ฐ๋ ๊ฐ์ค์น๊ฐ c[i]
์ธ ๊ฐ์ ์ด๋ค.
๊ฐ์ ์ ๊ฐ์๋ฅผ M
๊ฐ๋ผ๊ณ ํ ๋,
public class Main {
static int [] a, b;
static long [ ] c, dist;
public static void main(String[] args) throws IOException {
for (int i = 0; i < M; i++) {
int start = a[i];
int end = b[i];
long weight = c[i];
long oldValue = dist[end];
if(dist[start] != Long.MAX_VALUE){
dist[end] = Math.min(dist[end], dist[start] + weight);
}
if(oldValue != dist[end]){
System.out.println(-1);
return;
}
}
}
}
M-1
๋ฒ์งธ ๋ฐ๋ณต๊น์ง๋ dist[]์ ๊ฐ์ ๊ณ์ ์ํ์์ผ ์๊ฒ ๊ฐฑ์ ํ๋ค. ์ดํ M
๋ฒ์งธ ๋ฐ๋ณต์์๋ ํ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ฐ์ด๋ผ๋, ์ํ ๊ณผ์ ์ ๊ฑฐ์ณค๋๋, ๊ฐ์ด ๊ฐฑ์ ๋๋ฉด ์์ ์ฌ์ดํด์ด ์๋ ๊ฒ์์ผ๋ก, ํด๋น ๊ทธ๋ํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ด ๋ถ๊ฐํ๋ค๋ ์๋ฏธ์ -1์ ์ถ๋ ฅํ๋ค.