Практикум по курсу "Алгоритмизация и программирование". Часть 2. Андрианова А.А - 115 стр.

UptoLike

. Практикум по курсу «Алгоритмизация и программирование». Часть 2
return;
}
// цикл поиска непомеченных вершин,
// смежных s-ой вершине
for(j=0;j<g.n;j++)
if(x[j]==0 && g.a[s][j]>0 && g.a[s][j]!=MAX_INT)
// переход в смежную вершину с номером j
// рекурсивный вызов для поиска всех путей
// из j-ой вершины в t-ую
AllWays(g,j+1,t+1,x,k+1, sum+g.a[s][j]);
// возврат из s-ой вершины, снятие пометки о том,
// что s-ая вершина включена в путь
x[s]=0;
}
Для нерекурсивного варианта этой функции требуется только граф и но-
мера начальной и конечной вершин. Массив пометок, номер вершины в пути
и длина пути будут созданы внутри функции.
// определение нерекурсивной функции поиска всех путей
//в графе, соединяющих две заданные вершины
void AllWays(Graph2 g,int s, int t, int* x)
{
int v=s, // номер текущей вершины
k=2, // порядковый номер вершины в пути
jj=-1, // номер вершины, с которой начинается
// поиск смежных вершин
sum=0, // длина построенного пути
j,f,ii,nom;
if(s==t) return;
s--; t--;
// вспомогательный стек для хранения вершин возврата
Stack st;
st.head=NULL;
// пометка начальной вершины
x[v]=1;
while(true)
{
f=0;
115
              .       Практикум по курсу «Алгоритмизация и программирование». Часть 2
                  return;
          }

          // цикл поиска непомеченных вершин,
          // смежных s-ой вершине
          for(j=0;j0 && g.a[s][j]!=MAX_INT)
                    // переход в смежную вершину с номером j
                    // рекурсивный вызов для поиска всех путей
                    // из j-ой вершины в t-ую
                    AllWays(g,j+1,t+1,x,k+1, sum+g.a[s][j]);

          // возврат из s-ой вершины, снятие пометки о том,
          // что s-ая вершина включена в путь
          x[s]=0;
   }

    Для нерекурсивного варианта этой функции требуется только граф и но-
мера начальной и конечной вершин. Массив пометок, номер вершины в пути
и длина пути будут созданы внутри функции.
   // определение нерекурсивной функции поиска всех путей
   //в графе, соединяющих две заданные вершины
   void AllWays(Graph2 g,int s, int t, int* x)
   {
         int v=s,     // номер текущей вершины
             k=2,     // порядковый номер вершины в пути
             jj=-1,   // номер вершины, с которой начинается
                      // поиск смежных вершин
            sum=0,    // длина построенного пути
            j,f,ii,nom;

          if(s==t) return;
          s--; t--;

          // вспомогательный стек для хранения вершин возврата
          Stack st;
          st.head=NULL;

          // пометка начальной вершины
          x[v]=1;

          while(true)
          {
               f=0;


                                       115