Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Решение задачи о кратчайшем расстоянии между вершинами ациклического орграфа.
- // Для хранения ребер используется матрица смежности.
- #include <iostream>
- #include <vector>
- #define NMAX 1000
- #define BIG_INT (INT_MAX / 2)
- // Подумайте сами, почему не просто INT_MAX, а половина
- using namespace std;
- vector<vector<int>> A(NMAX, vector<int>(NMAX, BIG_INT));
- // A - матрица смежности.
- // vector удобен из-за инициализации константой.
- // Вектоп описан глобально, чтобы не передавать его как параметр в функцию DFS.
- // Но из-за этого приходится определять размеры по максимуму, а не до n.
- // Выбирайте, что кажется удобнее.
- int Order[NMAX]; // Порядок вершин слева направо
- int Vert[NMAX]; // Наоборот, номера вершин по порядку слева направо
- int Visit[NMAX]; // Флаги посещенности вершин при обходе
- int n, m, Number;
- // Функция рекурсивного обхода в глубину
- void DFS(int u) {
- Visit[u] = 1;
- for (int v = 0; v < n; v++) {
- if (A[u][v] != BIG_INT && !Visit[v]) {
- DFS(v);
- }
- }
- Order[u] = --Number; // Нумерация в обратном порядке выхода
- }
- int main() {
- int u, v, len;
- cin >> n >> m;
- vector<int> L(n, BIG_INT); // Расстояния от исходной вершины
- Number = n; // Для нумерации вершин
- for (int i = 0; i < m; i++) {
- cin >> u >> v >> len; // Ребро: откуда, куда, длина
- A[u-1][v-1] = len; // Длины храним в матрице смежности
- }
- // Вызываем DFS, пока не пронумеруются все вершины
- for (u = 0; u < n; u++)
- if (!Visit[u])
- DFS(u);
- // Имеем для каждой вершины ее порядок слева направо
- // Получаем список вершин слева направо
- for (u = 0; u < n; u++)
- Vert[Order[u]] = u;
- int u1, u2;
- cin >> u1 >> u2; // Исходная и конечная вершины
- u1--; u2--;
- L[u1] = 0;
- // Цикл пересчета минимальных расстояний от u1 направо до u2
- for (int i=Order[u1]; i < Order[u2]; i++)
- for (int j = i + 1; j <= Order[u2]; j++)
- L[Vert[j]] = __min(L[Vert[j]], L[Vert[i]] + A[Vert[i]][Vert[j]]);
- cout << L[u2] << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement