Advertisement
fabis_sparks

Min

May 27th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.75 KB | None | 0 0
  1. for (u = 0; u < p; u++)
  2.         {
  3.             t[u] = infinity; //Сначала все кратчайшие пути из s в i
  4.                              //равны бесконечности
  5.             x[u] = 0;        // и нет кратчайшего пути ни для одной вершины
  6.         }
  7.         h[s] = 0; // s - начало пути, поэтому этой вершине ничего не предшествует
  8.         t[s] = 0; // Кратчайший путь из s в s равен 0
  9.         x[s] = 1; // Для вершины s найден кратчайший путь
  10.         v = s;    // Делаем s текущей вершиной
  11.  
  12.         while (1)
  13.         {
  14.             // Перебираем все вершины, смежные v, и ищем для них кратчайший путь
  15.             for (u = 0; u < p; u++)
  16.             {
  17.                 if (a[v][u] == 0) continue; // Вершины u и v несмежные
  18.                 if (x[u] == 0 && t[u] > t[v] + a[v][u]) //Если для вершины u еще не
  19.                                                         //найден кратчайший путь
  20.                                                         // и новый путь в u короче чем
  21.                                                         //старый, то
  22.                 {
  23.                     t[u] = t[v] + a[v][u];  //запоминаем более короткую длину пути в
  24.                                             //массив t и
  25.                     h[u] = v;   //запоминаем, что v->u часть кратчайшего
  26.                                 //пути из s->u
  27.                 }
  28.             }
  29.  
  30.             // Ищем из всех длин некратчайших путей самый короткий
  31.             int w = infinity;  // Для поиска самого короткого пути
  32.             v = -1;            // В конце поиска v - вершина, в которую будет
  33.                                // найден новый кратчайший путь. Она станет
  34.                                // текущей вершиной
  35.             for (u = 0; u < p; u++) // Перебираем все вершины.
  36.             {
  37.                 if (x[u] == 0 && t[u] < w) // Если для вершины не найден кратчайший
  38.                                            // путь и если длина пути в вершину u меньше
  39.                                            // уже найденной, то
  40.                 {
  41.                     v = u; // текущей вершиной становится u-я вершина
  42.                     w = t[u];
  43.                 }
  44.             }
  45.             if (v == -1)
  46.             {
  47.                 cout << "Нет пути из вершины " << s << " в вершину " << g << "." << endl;
  48.                 break;
  49.             }
  50.             if (v == g) // Найден кратчайший путь,
  51.             {        // выводим его
  52.                 cout << "Кратчайший путь из вершины " << s << " в вершину " << g << ":";
  53.                 u = g;
  54.                 while (u != s)
  55.                 {
  56.                     cout << " " << u;
  57.                     u = h[u];
  58.                 }
  59.                 cout << " " << s << ". Длина пути - " << t[g];
  60.                 break;
  61.             }
  62.             x[v] = 1;
  63.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement