๋ฌธ์
ํ์ด
1๋ฒ ๋ฐ์ ์๋ถํฐ N๋ฒ์งธ ๋ฐ์ ์๊น์ง์ ์ต์ ๋น์ฉ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์๋ค. ๋จผ์ ๊ฐ ๋ฐ์ ์์ ์ขํ๋ฅผ ์ ์ฅ(plant)ํ๊ณ , ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ์ ์ฅ(connected)ํ์๋ค. ๋ค์์ผ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๊ธฐ ์ , 1๋ฒ๋ถํฐ ๊ฐ ์ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ด๋ distance ๋ฐฐ์ด์ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ์๋ 0, ์ฐ๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ์๋ INF๋ก ์ด๊ธฐํํด์ฃผ์๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ๋ฉด์ ๊ฐ์ค์น๋ฅผ ๋ํด์ฃผ๋ ๋ถ๋ถ์ ๊ฐ ์ขํ๊ฐ์ ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ณต์์ ํตํด ๊ตฌํ๋ค. ์ถ๊ฐ์ ์ผ๋ก ์ธ์ ํ ํ๋ ฌ์์ ์ฐพ๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ฌ๋ฆฌ ๋ชจ๋ ๋ฐ์ ์์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ํด์ ๊ฐฑ์ ํด ์ค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ 1~N๊น์ง ์๊ธฐ ์์ ์ ์ ์ธํ๊ณ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์ ํด์ฃผ์๋ค.
ํ๋ฉด์ ํค๋งธ๋ ๋ถ๋ถ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์์ํ๊ธฐ ์ ์ ์์ ์ง์ ์ ๋ฐฉ๋ฌธ์ฒดํฌ ํ ํ ๋ค์ ์ ๋ถํฐ ์ฐพ์๋๋ฐ ์ด๋ด ๊ฒฝ์ฐ ๋ค์์ ๋ฐ๋ก๊ฐ ์กด์ฌํ๋ค.
1 => (0,0)
2 => (-1, -1)
3 => (1,1)
1๊ณผ 2๊ฐ ์ฐ๊ฒฐ
ํด๋น ๋ฐ๋ก์์ 1์ ๋จผ์ ๋ฐฉ๋ฌธ์ฒดํฌํ๊ณ ๋ค์ ๋ฐ์ ์๋ถํฐ ํ์ธํ๊ฒ ๋๋ฉด ์ต๋จ๋น์ฉ์ 2-3์ ์๋ ์ ๋ถ์ ๊ธธ์ด๊ฐ ๋๋ค. ํ์ง๋ง 1์์ 3์ผ๋ก ๋ฐ๋ก ์ฐ๊ฒฐํ๋ ๊ฒฝ์ฐ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ 1๋ถํฐ ์์ํด์ ๋ฐ๋ก ์ฐ๊ฒฐํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์๋๋ ๊ณผ์ ์ด ํ์ํ๋ค. ๋ฐ๋ผ์ 1๋ฒ ๋ฐ์ ์์ ๋ํด ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ๋ฐ๋ก ํ์ง ์์์ผ๋ก์จ 1๋ฒ๋ถํฐ ๋ค๋ฅธ ๋ฐ์ ์๊น์ง์ ์ง์ ์๋ ๊ฑฐ๋ฆฌ๊ฐ ๊ณ ๋ ค๋ ์ ์๋๋ก ํ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Solution1277 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N, W;
static double M, INF = 200001;
static Point[] plant;
static boolean[][] connected;
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
N = Integer.parseInt(input[0]);
W = Integer.parseInt(input[1]);
String MLine = br.readLine();
M = Double.parseDouble(MLine);
plant = new Point[N + 1];
connected = new boolean[N + 1][N + 1];
for (int i = 1; i < N + 1; i++) {
String[] line = br.readLine().split(" ");
plant[i] = new Point(Integer.parseInt(line[0]), Integer.parseInt(line[1]));
}
for (int i = 0; i < W; i++) {
String[] line = br.readLine().split(" ");
connected[Integer.parseInt(line[0])][Integer.parseInt(line[1])] = true;
connected[Integer.parseInt(line[1])][Integer.parseInt(line[0])] = true;
}
System.out.println(dijstra());
}
private static long dijstra() {
double[] distance = new double[N + 1];
for (int i = 1; i < N + 1; i++) {
distance[i] = INF;
}
distance[1] = 0;
for (int i = 2; i < N + 1; i++) {
if (connected[1][i]) distance[i] = 0;
}
boolean[] visited = new boolean[N + 1];
for (int i = 0; i < N; i++) {
double minDist = INF;
int cur = 0;
for (int j = 1; j < N + 1; j++) {
if (!visited[j] && minDist >= distance[j]) {
minDist = distance[j];
cur = j;
}
}
if (cur == N) break;
visited[cur] = true;
for (int j = 1; j < N + 1; j++) {
if (j == cur) continue;
int next = j;
if (distance[next] > distance[cur] + getDistance(cur, next)) {
distance[next] = distance[cur] + getDistance(cur, next);
}
}
}
return (long) (distance[N] * 1000);
}
private static double getDistance(int cur, int next) {
if (connected[cur][next]) return 0;
Point src = plant[cur];
Point dest = plant[next];
double dist = Math.pow(src.x - dest.x, 2) + Math.pow(src.y - dest.y, 2);
return Math.sqrt(dist);
}
static class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
'๐ Algorithm > ๐ป ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2629. ์ํ ์ ์ธ (0) | 2021.04.01 |
---|---|
[๋ฐฑ์ค] - 2206. ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2021.03.24 |
[๋ฐฑ์ค] 1799. ๋น์ (0) | 2021.03.07 |
[๋ฐฑ์ค] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.03.06 |
[๋ฐฑ์ค] 1987. ์ํ๋ฒณ (0) | 2021.02.19 |
๋๊ธ