Краткое описание алгоритма Дейкстры

1. Для самого короткого метода алгоритма путь , который мы используем является наиболее часто используемым Дейкстры алгоритм решения, но в кратчайший алгоритм пути часто некоторый вариант алгоритма Дейкстры, но основной является необходимость решить то же самое от источника с до вершины V кратчайший путь, который появляется в названии дополнительной другой случай , что путь является источником к месту назначения более чем одного , а затем есть два пути , чтобы достигнуть кратчайшее расстояние выше субъекта будет дан второй масштаб (второй расстояние шкало) требуется , чтобы выбрать вторые шкалы оптимальных кратчайшие пути во всем пути, второй масштаб около трех видов общих методов или их сочетание темы

2 являются следующие:

① к каждому краю, чтобы добавить правую сторону (например, стоимость), а затем попросить требование, чтобы потратить на пути ряда кратчайших путей и минимальной (если другая сторона определена права также могут быть самым большим)

② добавить нужную точку (например, каждый город может собирать материалы) в каждую точку, то самый короткий путь, когда число точек на правильном пути и требование самого крупного (если это право указать другие определения могут быть это самый маленький)

③ прямо спросил, сколько кратчайших путей

Для темы этих трех методов, нам нужно только добавить массив, чтобы сохранить новый вес края или число точек вправо или кратчайший путь, Дейкстр быть затем модифицирован, чтобы оптимизировать шаги d [v] являются алгоритмический, другие части не должны быть изменены

3. Для следующих трех способов объяснения дается модификация темы коды:

① увеличение веса края

Представитель дополнительные расходы на правую сторону, например, представленные стоимостью [и] [v] и-> v стоимость (с помощью ввода заголовка) и добавляет массив С [], так что с точкой начала достигает вершину и с занимает минимум когда с [и], инициализация только с [с] = 0, остальные с [v] представляет INF, так что вы можете д [и] + G, [и] [v] <d [v] обновление D [ v] и с [V], и когда d [и] + G, [и] [v] == d [v] и с [и] + стоимость [и] [V] <с [V] (то есть, может быть s v достигает минимума, когда обновление требует более) с [v], следующий код:

for(int v = 0; v < n; v++){
	if(vis[v] == false && G[u][v] != INF){
		if(d[u] + G[u][v] < d[v]){
			d[v] = d[u] + G[u][v];
			c[v] = c[u] + cost[u][v];
		}else if(d[u] + G[u][v] == d[v] && c[u] + cost[u][v] < c[v]){
			c[v] = c[u] + cost[u][v];
		}
	}
} 

② новый пункт правой

Новый материал права на точку от имени города можно получить, например, представляет собой количество товаров в городе и (по входу заголовка) и добавляет массив ш [] вес [и], время инициализации только ш [s] это вес [с], остальные ш [и] = 0, так что вы можете, когда d [и] + G, [и] [v] <d [v] обновление d [v] и ш [V], когда при d [и] + G, [и] [v] == d [v] и с [и] + стоимость [и] [V]> [v] (то есть максимальное количество материалов может быть более оптимальным с достигает v) обновить ш [V], следующий код:

for(int v = 0; v < n; v++){
	if(vis[v] == false && G[u][v] != INF){
		if(d[u] + G[u][v] < d[v]){
			d[v] = d[u] + G[u][v];
			w[v] = w[u] + weight[u][v];
		}else if(d[u] + G[u][v] == d[v] && w[u] + weight[v] < w[v]){
			w[v] = w[u] + weight[v];
		}
	}
} 

Решение количества кратчайшего пути ③

Только вам нужно добавить массив NUM [], так что от начальной точки сек кратчайшего пути к числу вершин V является Num [и], при инициализации только NUM [s] является 1, Num [и] 0, так что вы можете при d [и] + G, [и] [v] <d [v] обновление d [v], и пусть Num [v] унаследованные от NUM [и], и когда d [и] + G, [и] [ v] == d [v] и с [и] + стоимость [и] [V]> [v] НЮМ [и] был добавлен Num [v], код выглядит следующим образом:

for(int v = 0; v < n; v++){
	if(vis[v] == false && G[u][v] != INF){
		if(d[u] + G[u][v] < d[v]){
			d[v] = d[u] + G[u][v];
			num[v] = num[u];
		}else if(d[u] + G[u][v] == d[v){
			num[v] += num[u];
		}
	}
} 

 

рекомендация

отblog.csdn.net/qq_39445165/article/details/93230765