Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <string>
- using namespace std;
- const int INF = 100000;
- int Dejk(int start, int end, int **a, int n)
- {
- int *weight = new int[n]; //массив меток
- for (int i = 0; i < n; i++)
- weight[i] = INF;
- weight[start] = 0;
- bool *status = new bool[n]; //массив статуса вершин
- for (int i = 0; i < n; i++)
- status[i] = true;
- for (int i = 0; i < n; i++)
- {
- int min = INF - 1, temp = 0;
- for (int j = 0; j < n; j++) //цикл поиска минимальной метки
- if ((status[j] == true) and (weight[j] < min))
- {
- min = weight[j];
- temp = j;
- }
- if (min == INF - 1)
- return weight[end];
- for (int j = 0; j < n; j++)
- if ((a[temp][j] != INF) and (a[temp][j] + weight[temp] < weight[j])) //если элемент в матрице не равен 0 (т.е. из него есть путь) и если общее расстояние пути от изначальной вершины меньше метки
- weight[j] = a[temp][j] + weight[temp];
- status[temp] = false;
- }
- return weight[end];
- }
- int main()
- {
- int n, start, end;
- cin >> n >> start >> end;
- start--;
- end--;
- int **a;
- a = new int*[n]; //создаём двумерный массив
- for (int i = 0; i < n; i++)
- a[i] = new int[n];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++)
- {
- cin >> a[i][j];
- if (a[i][j] = -1)
- a[i][j] = INF;
- }
- int res = Dejk(start, end, a, n);
- if (res != INF)
- cout << res << endl;
- else
- cout << -1 << endl;
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement