Cod sursa(job #2750210)

Utilizator andrei.florea0405Florea Andrei-Bogdan andrei.florea0405 Data 10 mai 2021 11:25:24
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;

const int kNmax = 1005;

class Task {
public:
    void solve() {
           read_input();
           print_output(get_result());
    }

private:
    int n;
	int w[kNmax][kNmax];

	void read_input() {
		ifstream fin("in");
		fin >> n;

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                fin >> w[i][j];
            }
        }

		fin.close();
	}


    vector<vector<int>> get_result() {
        vector<vector<int>> distances(n + 1, vector<int>(n + 1, INT_MAX));

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                distances[i][j] = w[i][j];
                if (distances[i][j] == 0 && i != j) {
                    distances[i][j] = INT_MAX;
                }
            }
        }

        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                if (distances[i][k] == INT_MAX) {
                    continue;
                }

                for (int j = 1; j <= n; j++) {
                    if (distances[k][j] == INT_MAX || i == j) {
                        continue;
                    }
                    distances[i][j] = min(distances[i][j], 
                                          distances[i][k] + distances[k][j]);
                }
            }
        }

        return distances;        
    }
       

    void print_output(vector<vector<int>> distances) {
        ofstream fout("out");
        
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (distances[i][j] == INT_MAX) {
                    fout << "0 ";
                } else {
                    fout << distances[i][j] << " ";
                }
            }
            fout << "\n";
        }
        
        fout.close();
    }
};


int main() {
    Task *task = new Task();
    task->solve();
    delete task;
    return 0;
}