Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //формат ввода количество вершин, длины путей(отсутствие грани равняется 10000009), далее массив разрешенных граней(0 не разрешены, 1 //разрешены
- //3
- //10000009 7 3
- //7 10000009 10
- //2 215 10000009
- //0 1 1
- //10
- #include <iostream>
- #include <vector>
- using namespace std;
- void Floyd(vector<vector<int>>& w, vector<vector<int>>& h,const vector<int>& no) {
- for (int k = 0; k < w.size(); k++) {
- if(no[k] == 0) continue;
- for (int i = 0; i < w.size(); i++) {
- if(no[i] == 0) continue;
- for (int j = 0; j < w.size(); j++) {
- if(no[j] == 0) continue;
- if (w[i][k] + w[k][j] < w[i][j]) {
- w[i][j] = w[i][k] + w[k][j];
- h[i][j] = h[k][j];
- }
- }
- }
- }
- }
- int main(){
- int lenght;
- int min = 10000009;
- cin >> lenght;
- vector<vector<int>> w(lenght);
- for(int i =0;i <lenght; i++)
- {
- w[i].resize(lenght);
- for(int j =0; j< lenght; j++) {
- cin >> w[i][j];
- }
- }
- vector<int> no(lenght);
- for(int i=0;i <lenght;i++)
- {
- cin >>no[i];
- }
- vector<vector<int>> h(lenght);
- for(int i =0;i <lenght; i++)
- {
- h[i].resize(lenght);
- for(int j=0;j<lenght;j++)
- {
- h[i][j]=i;
- h[i][i]=-1;
- }
- }
- Floyd(w,h, no);
- for(int i=0;i<lenght;i++) {
- if(no[i] == 0) continue;
- for (int j = 0; j < lenght; j++) {
- if(no[j] == 0) continue;
- if(i==j) continue;
- if (w[i][j] < min) {
- min = w[i][j];
- }
- }
- }
- cout << min;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement