๋ฌธ์
ํ์ด
1๏ธโฃ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ ํ์ด
๐ก ์ฐธ๊ณ ํ Idea
๋จผ์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๋น์ฉ ๊ทธ๋ํ๊ฐ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฏธ ํ๋ฒ ๊ฑฐ์น ๋น์ฉ ๊ทธ๋ํ๋ผ๊ณ ์๊ฐํด์ผํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋์, ์ด ๊ทธ๋ํ๋ฅผ ๋ค์ ๋ถํด๋ฅผ ํด์ผํ๋๋ฐ ์ด๋ป๊ฒ ๋ถํดํ ์ ์์๊น?
ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฝ์ฐ
costs[u][v] = Math.min(costs[u][v], costs[u][m] + costs[m][v]);โ
์์ ๊ฐ์ด u์์ v๋ก ๊ฐ๋ ๋น์ฉ๋ณด๋ค, u์์ m์ผ๋ก ๊ฐ๋ค์ m์์ v๋ฅผ ๊ฑฐ์ณ์ ๊ฐ๋ ๋น์ฉ์ด ์ผ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ๋ฐฉ์์ด๋ค.
๋ฐ๋ผ์,
์ ๋ ฅ๋ฐ์ ๋น์ฉ ๊ทธ๋ํ์์costs[u][v] == costs[u][m] + costs[m][v]
์์ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ u v๊ฐ ์กด์ฌํ ๋
u์ v๋ ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด๊ณ ์ค์ ๋ก๋ ์กด์ฌํ์ง ์๋ ๊ฐ์ ์ผ๋ก ๊ฐ์ฃผํ ์ ์๋ค.
(๋จ, u์ v, m์ ์๋ก ๋ค๋ฅธ ์์น์ฌ์ผํ๋ค.)
๋ฐ๋ผ์ ์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด costs[u][v] = INF ์ ์ ๋ ฅํ์ฌ ๊ฐ์ ์ ์ ๊ฑฐํ๋ ์์ ์ด ํ์ํ๋ค.
๊ทธ๋ ๊ฒ ๋ค์ ๋ถํดํ ๊ทธ๋ํ๋ฅผ ํตํด, ํ๋ก์ด๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ต์ ๋น์ฉ์ ๋ค์ ๊ตฌํด๋ณด๊ณ
๋ค์ ๊ตฌํ ์ต์ ๋น์ฉ ๋ฐฐ์ด์ด ์ฒ์์ ์ ๋ ฅ๋ฐ์ ๋น์ฉ ๋ฐฐ์ด๊ณผ ์ผ์นํ๋์ง ์ํ๋์ง ์ฒดํฌํ๋ฉด๋๋ค.
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
final int MAX = 250000;
int[][] g = new int[N][N];
for (int u = 0; u < N; u++) {
String[] input = br.readLine().split(" ");
for (int v = 0; v < N; v++) {
g[u][v] = Integer.parseInt(input[v]);
}
}
int[][] costs = deepCopy(g);
for (int m = 0; m < N; m++) {
for (int u = 0; u < N; u++) {
for (int v = 0; v < N; v++) {
if (costs[u][v] == costs[u][m] + costs[m][v] && (u != v && v != m && u != m)) {
costs[u][v] = MAX;
costs[v][u] = MAX;
}
}
}
}
int ans = 0;
for (int r = 0; r < N; r++) {
for (int c = r + 1; c < N; c++) {
if (costs[r][c] != MAX) {
ans += costs[r][c];
}
}
}
for (int m = 0; m < N; m++) {
for (int u = 0; u < N; u++) {
for (int v = 0; v < N; v++) {
costs[u][v] = Math.min(costs[u][v], costs[u][m] + costs[m][v]);
}
}
}
if (isSame(costs, g)) {
System.out.println(ans);
} else {
System.out.println(-1);
}
}
private static boolean isSame(int[][] costs, int[][] g) {
int N = g.length;
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if (costs[r][c] != g[r][c]) {
return false;
}
}
}
return true;
}
private static int[][] deepCopy(int[][] g) {
int N = g.length;
int[][] result = new int[N][N];
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
result[r][c] = g[r][c];
}
}
return result;
}
}
๊ฒฐ๊ณผ