Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. // Dijkstra.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.     setlocale(0, "");
  12.     int C[10][10];
  13.     int n, m;
  14.     int x, y, c;
  15.     cout << "Введите кол-во вершин ";
  16.     cin >> n;
  17.     cout << endl;
  18.     cout << "Введите кол-во ребер ";
  19.     cin >> m;
  20.     cout << endl;
  21.     for (int i = 1; i <= n; i++)
  22.         for (int j = 1; j <= n; j++)
  23.             C[i][j] = 100;
  24.  
  25.     for (int i = 1; i <= m; i++) {
  26.         cout << "Введите откуда ребро, куда ребро, вес ребра " << endl;
  27.         cin >> x >> y >> c;
  28.         C[x][y] = c;
  29.     }
  30.  
  31.     for (int i = 1; i <= n; i++) {
  32.         cout << endl;
  33.         for (int j = 1; j <= n; j++) {
  34.             cout << " " << C[i][j];
  35.         }
  36.     }
  37.     cout << endl;
  38.  
  39.     // ДЕЙКСТРА
  40.     int S[10];
  41.     int D[10];
  42.     // Первый цикл где обнуляется S и заполняется D для первой вершины
  43.     for (int i = 1; i <= n; i++) {
  44.         S[i] = 0;
  45.         D[i] = C[1][i];
  46.     }
  47.     // Помечаем 1 вершину (источник) как просмотренную
  48.     S[1] = 1; int min, w;
  49.     // Второй цикл где n-1 проход, ищем минимальные и вносим их в S
  50.     for (int i = 1; i <= n-1; i++) {
  51.         // Переменная min равна 100 типа бесконечность
  52.         min = 100;
  53.         // Собсна поиск этого минимального ребра
  54.         for (int j = 2; j <= n; j++) {
  55.             // Если оно ещё не просмотрено и меньше минимума
  56.             if ((S[j] == 0) && (D[j] < min)) {
  57.                 // То переопределяем минимум и вершину w
  58.                 min = D[j];
  59.                 w = j;
  60.             }
  61.         }
  62.        
  63.         // Когда наконец вышли из цикла и нашли минимальную вершину, вносим ее как просмотренную
  64.         S[w] = 1;
  65.         // Второй цикл, переопределяем D
  66.         for (int j = 2; j <= n; j++) {
  67.             // Если вершина ещё не просмотрена и новый путь больше, то переопредляем
  68.             if ((D[j] > D[w] + C[w][j]) && (S[j] == 0)) {
  69.                 D[j] = D[w] + C[w][j];
  70.             }
  71.         }
  72.     }
  73.     for (int i = 2; i <= n; i++) {
  74.         cout << "k " << i << "-й вершине путь " << D[i] << endl;
  75.     }
  76.  
  77.  
  78.  
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement