Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iomanip>
- #include <vector>
- #include<iostream>
- using namespace std;
- void FloydWarshall(vector<vector<int>>&)//объявление функции
- int main() {
- vector<vector<int>> G {
- {0, 4, 0, 2, 2, 0, 0, 0, 0},
- {0, 0, 7, 0, 0, 3, 0, 0, 0},
- {0, 0, 0, 0, 0, 2, 0, 0, 0},
- {0, 0, 0, 0, 0, 0, 1, 1, 0},
- {0, 2, 0, 3, 0, 2, 0, 6, 1},
- {0, 0, 0, 0, 0, 0, 0, 0, 2},
- {0, 0, 0, 0, 0, 0, 0, 5, 0},
- {0, 0, 0, 0, 0, 0, 0, 0, 5},
- {0, 0, 0, 0, 0, 0, 0, 0, 0}
- }; // заданный граф
- FloydWarshall(G);// вызов функции
- for (auto &i: G) {// вывод нужной матрицы
- for (auto &j: i)
- cout << j << setw(3);
- cout << "\n";
- }
- return 0;
- }
- void FloydWarshall(vector<vector<int>> &myG){//описание функции
- int inf = 1000000000; //Необходимо для того, чтобы нулевые элементы недиагональные элементы сменили своё значение
- size_t k, i, j, w = myG.size();// не понял:(
- vector<vector<int>> minP = myG;// создаем еще один массив MiP и присваиваем ему MyG
- for (i = 0; i < w; i++)//Проход по матрице
- for (j = 0; j < w; j++)
- if (minP[i][j] == 0 && i != j)//условия недиагональныз нулей
- minP[i][j] = inf;// ставим вместо ноликов инфинити(не на диагонали )
- for (k = 0; k < w; k++)// В 3 следуших строчках мы прокручиваем цикл чтобы понять, какой вариант нам подходит(i->j или i->k->g)
- for (i = 0; i < w; i++)
- for (j = 0; j < w; j++)
- if (minP[i][k] + minP[k][j] < minP[i][j])//Условие позволяющее выбрать нужный путь(i->j или i->k->g)
- myG[i][j] = minP[i][k] + minP[k][j];// изменяет в МуG нужные ребра, информацию о которых мы узнали в MinP
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement