Занятие 8. Справочник

Занятие 8. Справочник

Алгоритм Дейкстры по матрице смежности с формированием массива предков Переменные, массивы и константаINF
static final int INF = Integer.MAX_VALUE;
static int n, s, np = 0;
static boolean[] used;
static int[] dist;
static int[] parent;
static int[][] graph;
staticintpath[];
Чтение данных, подготовка массивов
n = in.nextInt();
s = in.nextInt() - 1;
f = in.nextInt() - 1;
graph = new int[n][n];
used = new boolean[n];
dist = new int[n];
parent = new int[n];
path = new int[n];
for (int i = 0; i < n; i++)
	for (int j = 0; j < n; j++)
		graph[i][j] = in.nextInt();
for (int i = 0; i < n; i++)
	dist[i] = INF;
Собственно,алгоритм
static void dijkstra(int s) 
{
	parent[s] = -1;
	dist[s] = 0;
	for (int i = 0; i < n; i++) 
	{
		int v = -1;
		for (int j = 0; j < n; j++)
		{
			if (!used[j] && (v == -1 || dist[j] < dist[v]))
				v = j;
		used[v] = true;
		for (int j = 0; j < n; j++)
		{
			if (dist[v] + graph[v][j] < dist[j] &&
				graph[v][j] != 	-1) 
			{
				dist[j] = dist[v] + graph[v][j];
				parent[j] = v;
			}
		}
	}
}
Восстановление пути (рекурсивно, для формирования пути в прямом порядке)
static void recoverPath(int v) {
	if (v != s) recoverPath(parent[v]);
	path[np++] = v;
}
(запускается с параметром f)