о j-тий терміну (рядок варто вводити в розгляд, якщо вона містить хоча б одну одиницю). Нехай елемент. Тоді з вершини у вершину можна потрапити за два кроки. Таким чином, можна записати. Слід зауважити, що якщо в розглянутих рядках дві або більше одиниць, то слід опрацьовувати всі можливі варіанти попадання з однієї вершини в іншу, записуючи в матрицю довжину найліпшого з них.  
  Лістинг програми: 
  # include 
  # include 
  using namespace std; 
  int main () 
  {
  int N = 0, n = 0, c = 0, i = 0, k = 0; 
  cout <<"----------------------------------------- ----- "< 
 cout <<"| Poisk optimalnogo puti v nenagrujennom orgrafe | "< 
 cout <<"----------------------------------------- ----- "< 
 case1: 
  cout <<"Vvedite chislo vershin v orgrafe: "; 
  cin>> N; 
  if (N <= 1) 
  {
  cout <<"Kolichestvo vershin doljno bit '> 1! "< 
 goto case1; 
 } 
 ///МАТРИЦЯ суміжності :: 
  cout <<"Zapolnite matricu smejnosti (esli puti net, vvedite 0; esli put 'est', vvedite 1): "; 
  float ** A = new float * [N]; 
  for (i; i 
 A [i] = new float [N]; 
  for (i = 0; i 
 for (int k = 0; k 
 {
  cout <<"V"; 
  printf ("% d", i +1); 
  cout <<"-> V"; 
  printf ("% d", k +1); 
  cout <<'='; 
  scanf ("% f", & A [i] [k]); 
  if ((A [i] [k]! = 0) && (A [i] [k]! = 1)) 
  {
  cout <<"Vvodite tol'ko 0 ili 1! "< 
 return 0; 
 } 
  if ((i == k) & (A [i] [k] == 1)) 
  {
  
  cout <<"Na glavnoi diagonali doljni bit 'nuli! "< 
 return 0; 
  
 } 
 } 
 //// Звідки і куди? (Початкова і кінцева вершина в графі!!) 
  case2: 
  cout <<"Vvedite nachalnuiu vershinu: "; 
  cin>> n; 
  if (n> N) 
  {
  cout <<"Net takoi vershini! "< 
 goto case2; 
 } 
  if (n == 0) 
  {
  cout <<"Net takoi vershini! "< 
 goto case2; 
 } 
  case3: 
  cout <<"Vvedite konechnuyu vershinu: "; 
  cin>> c; 
  if (c> N) 
  {
  cout <<"Net takoi vershini! "< 
 goto case3; 
 } 
  if (c == 0) 
  {
  cout <<"Net takoi vershini! "< 
 goto case3; 
 } 
 ///Масив, де записується число кроків 
  int h = 1; 
  float * B = new float [N]; 
  for (i = 0; i 
 {
  B [i] = 0; 
 } 
 // В масиві B [N-1] шукаємо вершини, які достжіми з початку шляху 
 // т.е за один крок 
  for (k = 0; k 
 {
  if (A [n-1] [k] == 1) 
  B [k] = 1; 
 } 
 // Елементи фронту хвилі 
  while (h <50) 
  {
  for (i = 0; i 
 {
  for (k = 0; k 
 {
  if ((B [i] == h) && (A [i] [k] == 1) && (B [k] == 0)) 
  B [k] = h +1; 
 } 
 } 
  h + +; 
 } 
  B [n-1] = 0; 
  if (B [c-1]! = 0) 
  {
 ///Вивід на екран таблицю 
  cout <<" nTablica stoimosti minimalnogo puti: "< 
 for (i = 0; i 
 {
  printf ("% f", B [i]); 
 } 
 // Пошук зворотного шляхи 
  cout <<" n nOptimal'nii put '(v obratnom poryadke): n "<<" V "; 
  printf ("% d", c); 
  h = c-1; 
  int b = B [c-1]; 
  while (b> 0) 
  {
  for (i = 0; i 
 if ((A [i] [h] == 1) && (B [i] == B [h] -1)) 
  {
  cout <<"V"; 
  printf ("% d", i +1); 
  h = i; 
  b -; 
 } 
 } 
  cout <<" n"; 
 } 
  else 
  {
  cout <<" nPuti net! n"; 
 } 
  delete A, B; return 0; 
 } 
   Приклади виконання програми: 
  1. 
  
  2. 
  
   3. 
  
   Використана література: 
  1. В«Теорія графівВ». Методичні вказівки по підготовці до контрольних робіт з дисципліни В«Дискретна математикаВ». Сост.: Н.І. Житнікова, Г.І. Федорова, А.К. Галімов. - Уфа, 2005 -37 с. 
  2. Курс лекцій з дискретній математиці Житникова В.П. 
  3. В«Самовчитель С + +В», Переклад з англ. -3 Изд .. - СПб.: БХВ-Петербург, 2005 - 688 с. 
  4. В«Дискретна математика для програмістів В», Ф.А.Новіков. 
  5. В«Введення в дискретну математику В», Яблонський. 
  6. В«Курс дискретної математики В», Нефер, Осипова. 
  7. В«ІнформатикаВ» Л.З.Шауцукова.