Advertisement
cincout

Untitled

Jan 6th, 2020
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1. // Решение задачи о кратчайшем расстоянии между вершинами ациклического орграфа.
  2. // Для хранения ребер используется матрица смежности.
  3. #include <iostream>
  4. #include <vector>
  5. #define NMAX 1000
  6. #define BIG_INT (INT_MAX / 2)
  7. // Подумайте сами, почему не просто INT_MAX, а половина
  8. using namespace std;
  9.  
  10. vector<vector<int>> A(NMAX, vector<int>(NMAX, BIG_INT));
  11. // A - матрица смежности.
  12. // vector удобен из-за инициализации константой.
  13. // Вектоп описан глобально, чтобы не передавать его как параметр в функцию DFS.
  14. // Но из-за этого приходится определять размеры по максимуму, а не до n.
  15. // Выбирайте, что кажется удобнее.
  16. int Order[NMAX]; // Порядок вершин слева направо
  17. int Vert[NMAX]; // Наоборот, номера вершин по порядку слева направо
  18. int Visit[NMAX]; // Флаги посещенности вершин при обходе
  19. int n, m, Number;
  20.  
  21. // Функция рекурсивного обхода в глубину
  22. void DFS(int u) {
  23. Visit[u] = 1;
  24. for (int v = 0; v < n; v++) {
  25. if (A[u][v] != BIG_INT && !Visit[v]) {
  26. DFS(v);
  27. }
  28. }
  29. Order[u] = --Number; // Нумерация в обратном порядке выхода
  30. }
  31.  
  32. int main() {
  33. int u, v, len;
  34. cin >> n >> m;
  35. vector<int> L(n, BIG_INT); // Расстояния от исходной вершины
  36. Number = n; // Для нумерации вершин
  37. for (int i = 0; i < m; i++) {
  38. cin >> u >> v >> len; // Ребро: откуда, куда, длина
  39. A[u-1][v-1] = len; // Длины храним в матрице смежности
  40. }
  41.  
  42. // Вызываем DFS, пока не пронумеруются все вершины
  43. for (u = 0; u < n; u++)
  44. if (!Visit[u])
  45. DFS(u);
  46.  
  47. // Имеем для каждой вершины ее порядок слева направо
  48. // Получаем список вершин слева направо
  49. for (u = 0; u < n; u++)
  50. Vert[Order[u]] = u;
  51.  
  52. int u1, u2;
  53. cin >> u1 >> u2; // Исходная и конечная вершины
  54. u1--; u2--;
  55. L[u1] = 0;
  56. // Цикл пересчета минимальных расстояний от u1 направо до u2
  57. for (int i=Order[u1]; i < Order[u2]; i++)
  58. for (int j = i + 1; j <= Order[u2]; j++)
  59. L[Vert[j]] = __min(L[Vert[j]], L[Vert[i]] + A[Vert[i]][Vert[j]]);
  60.  
  61. cout << L[u2] << endl;
  62. return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement