2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Алгоритм на графе
Сообщение12.12.2008, 18:07 
Аватара пользователя


01/12/07
172
Подскажите пожалуйста какой алгоритм используется в этой программе:
Код:
ports[N][N]={... };//матрица расстояний
int s;                    //начало пути              
int g;                   //конец пути
int x[N];              //Массив, содержащий единицы и нули для каждой вершины,
                          // x[i]=0 - еще не найден кратчайший путь в i-ю вершину,
                          // x[i]=1 - кратчайший путь в i-ю вершину уже найден
int t[N];               //t[i] - длина кратчайшего пути от вершины s в i
int h[N];              //h[i] - вершина, предшествующая i-й вершине
                // на кратчайшем пути
int u;         
   for (u=0;u<N;u++)
   {
     t[u]=99999999;        //в начале   длина кратчайшего пути от вершины s в u бесконечность
    x[u]=0;        // и нет кратчайшего пути ни для одной вершины

   }
h[s]=0;
t[s]=0;
x[s]=1;
int v=s;
  while(1)                         // Перебираем все вершины, смежные v, и ищем для них кратчайший путь

   {
     
      for(u=0;u<N;u++)
      {
         if(ports[v][u]==0)continue;                           // Вершины u и v несмежные
         if(x[u]==0 && t[u]>t[v]+ports[v][u])
         {
            t[u]=t[v]+ports[v][u];                                //запоминаем более короткую длину пути в
                                                                //массив t и

            h[u]=v;                                                //запоминаем, что v->u часть кратчайшего
                                                               //пути из s->u

         }
      }

        // Ищем из всех длин некратчайших путей самый короткий

      int w=99999999; 
      v=-1;                                      // В конце поиска v - вершина, в которую будет
                                                     // найден новый кратчайший путь. Она станет
                                                     // текущей вершиной

      for(u=0;u<N;u++)
     {
         if(x[u]==0 && t[u]<w)                         // Если для вершины не найден кратчайший
                                                                 // путь и если длина пути в вершину u меньше
                                                                 // уже найденной, то
         {
            v=u;                                              // текущей вершиной становится u-я вершина
            w=t[u];
         }
      }
          if(v==g)                                              //найден кратчайший путь,     
      {                                                              // выводим его
         printf("Korotkiy put from %d to %d\n",s,g);
         u=g;
         while(u!=s)
         {
            printf(" %d\n",u);
            u=h[u];
         }
         printf(" %d dlina puti - %d\n",s,t[g]);                   //ввыод длины пути
         break;
      }
      x[v]=1;
   }

}



Заранее спасибо!

 Профиль  
                  
 
 
Сообщение12.12.2008, 22:40 


25/01/06
102
Это алгоритм Дейкстры (Dijkstra's Algorithm).

 Профиль  
                  
 
 
Сообщение14.12.2008, 11:31 
Аватара пользователя


01/12/07
172
Обьясните пожалуйста, что делают эти два цикла


Код:

for(u=0;u<N;u++)
      {
         if(ports[v][u]==0)continue;                           // Вершины u и v несмежные
         if(x[u]==0 && t[u]>t[v]+ports[v][u])
         {
            t[u]=t[v]+ports[v][u];                                //запоминаем более короткую длину пути в
                                                                //массив t и

            h[u]=v;                                                //запоминаем, что v->u часть кратчайшего
                                                               //пути из s->u

         }
      }
int w=99999999; 
      v=-1;                                      // В конце поиска v - вершина, в которую будет
                                                     // найден новый кратчайший путь. Она станет
                                                     // текущей вершиной

  for(u=0;u<N;u++)
     {
         if(x[u]==0 && t[u]<w)                         // Если для вершины не найден кратчайший
                                                                 // путь и если длина пути в вершину u меньше
                                                                 // уже найденной, то
         {
            v=u;                                              // текущей вершиной становится u-я вершина
            w=t[u];
         }
      }


 Профиль  
                  
 
 
Сообщение15.12.2008, 22:33 


25/01/06
102
Подробное описание алгоритма Дейкстры есть на википедии (и на русском, и на английском). Причем в русском варианте есть подробно разобраный пример. А в английском варинате приведена очень полезная метафора, объясняющая алгоритм в наглядных бытовых терминах. Очень рекомендую. Также хорошо пересказать как там написано мне будет трудно :-)

 Профиль  
                  
 
 
Сообщение16.12.2008, 16:51 
Аватара пользователя


01/12/07
172
Спасибо
:)

 Профиль  
                  
 
 
Сообщение24.12.2008, 14:32 


23/12/08
245
Украина
кстати вопрос:
Почему люди используют числа типа 9999999 вместо -1 например?

 Профиль  
                  
 
 
Сообщение24.12.2008, 15:31 
Заслуженный участник


15/05/05
3445
USA
Nerazumovskiy писал(а):
кстати вопрос:
Почему люди используют числа типа 9999999 вместо -1 например?

Я ни разу не слышал про людей, которые используют 9999999 вместо -1.

Иногда 9999999 используют вместо $+\infty$ как начальное значение при поиске минимума. Это допустимо, если известно, что все числа - меньше. Хотя лучше бы так не делать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group