Новости
О Центре
Кластер
Обучение
Основной курс по параллельному программированию
Учебные курсы
Магистратура
Дополнительное образование
Работы студентов
Библиотека
Исследования
Конференции
Полезные ссылки
NVIDIA
Контакты
О сайте
Имя:
Пароль:
запомнить:
Забыли пароль? Регистрация

Метод решения

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

Пример: Доставить груз из одной части города в другую за наименьшее время.

При построении модели данной задачи, граф получается неориентированным, взвешенным.

Такой граф можно описать с помощью матрицы:

Рассмотрим взвешенный граф G = ( V ,E ,w),

где V - множество вершин графа, E - множество дуг, и w(i,j) - вес дуги соединяющей вершины i и j.

Рассмотрим подмножество {v1, v2, ... ,vk}, k<=n. Для любой пары вершин, рассмотрим все пути, промежуточные вершины которых принадлежат мн-ву {v1, v2, ... ,vk}. Пусть pk(i,j) есть кратчайший путь из них, и пусть dk(i,j) - вес этого пути. Если вершина Vk не принадлежит кратчайшему пути, то pk(i,j) = pk-1(i,j). Однако, если вершина Vk принадлежит кратчайшему пути, то мы можем разбить кратчайший путь на два пути: Vi ->Vk и Vk -> Vj. Таким образом dk(i,j) = dk-1(i,k) + dk-1(k,j). Следовательно длина кратчайшего пути вычисляется следующим образом:

Таким образом, длина кратчайшего пути из вершины Vi в Vj есть dn(i,j). В итоге, решением задачи будет матрица Dn = (dn(i,j)).

Реализация последовательного алгоритма.

int **d,*dco,*dce;

d=(int**)new int[size];

for (k=0;k<size;++k){
  dco=d[k];
  for (i=0;i<size;++i){
   dce=d[i];
   for (j=0;j<size;++j)
    if (dce[j]>dce[k]+dco[j])
     dce[j]=dce[k]+dco[j];
  };
 };

Новости

22.10.2012
04.09.2012
05.04.2012
06.03.2012
02.03.2012