Подскажите пожалуйста какой алгоритм используется в этой программе:
Код:
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;
   }
}
 
Заранее спасибо!