package sk.upjs.paz.cvicenie10;
import java.util.Arrays;
public class NajkratsieCesty {
public static final int INF = Integer.MAX_VALUE / 2;
private static int[] bellmanFord(int[][] matica, int start) {
return null;
}
private static int[] dijkstra(int[][] matica, int start) {
int[] d = new int[matica.length];
Arrays.fill(d, INF);
d[start] = 0;
// mnozina Q obsahuje vsetky vrcholy
boolean[] q = new boolean[matica.length];
Arrays.fill(q, true);
for (int j = 0; j < matica.length; j++) {
int index = -1;
int dist = Integer.MAX_VALUE;
for (int i = 0; i < matica.length; i++) {
if (q[i] && d[i] < dist) {
index = i;
dist = d[i];
}
}
// relax
for (int i = 0; i < matica.length; i++) {
if (matica[index][i] != INF && index != i) {
if (d[index] + matica[index][i] < d[i])
d[i] = d[index] + matica[index][i];
}
}
q[index] = false;
}
return d;
}
private static int[][] floydWarshallK(int[][] matica) {
/*int[][] d = new int[matica.length][matica[0].length];
for (int i = 0; i < d.length; i++) {
Arrays.fill(d[i], INF);
}*/
int[][] d = matica.clone();
int n = matica.length;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
for (int k = 0; k < n; k++)
/* if (d[i][k] != INF && d[k][j] != INF)
if (d[i][j] == INF || d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j];*/
if (d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j];
return d;
}
private static int[][] floydWarshall(int[][] matica) {
/*int[][] d = new int[matica.length][matica[0].length];
for (int i = 0; i < d.length; i++) {
Arrays.fill(d[i], INF);
}*/
int[][] d = matica.clone();
int n = matica.length;
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
/* if (d[i][k] != INF && d[k][j] != INF)
if (d[i][j] == INF || d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j];*/
if (d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j];
return d;
}
public static void main(String[] args) {
// nekonecno
int x = INF;
/*int[][] matica = {
{0, 2, x, 9, x, 1},
{2, 0, 3, x, 8, x},
{x, 3, 0, 4, x, 7},
{9, x, 4, 0, 5, x},
{x, 8, x, 5, 0, 6},
{1, x, 7, x, 6, 0}
};*/
int[][] matica = new int[5][5];
for (int i = 0; i < matica.length; i++) {
for (int j = 0; j < matica[0].length; j++) {
matica[i][j] = INF;
}
}
for (int i = 0; i < matica.length; i++) {
matica[i][i] = 0;
}
/*for (int i = 0; i < 100; i++) {
int index1 = (int) (Math.random() * 100);
int index2 = (int) (Math.random() * 100);
int value = (int) (Math.random() * 1000) + 1;
if (index1 != index2) {
matica[index1][index2] = matica[index2][index1] = value;
}
}*/
matica[0][1] = matica[1][0] = 10;
matica[1][2] = matica[2][1] = 13;
matica[2][3] = matica[3][2] = 1;
matica[3][4] = matica[4][3] = 2;
matica[4][0] = matica[0][4] = 3;
System.out.println(Arrays.deepToString(matica));
int[][] res1 = floydWarshall(matica);
int[][] res2 = floydWarshallK(matica);
System.out.println(Arrays.deepToString(res1));
System.out.println(Arrays.deepToString(res2));
System.out.println(Arrays.deepEquals(res1, res2));
}
}