Cod sursa(job #1585181)

Utilizator sebii_cSebastian Claici sebii_c Data 30 ianuarie 2016 20:32:24
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <limits>
#include <vector>

using namespace std;

/**@brief Performs Roy-Floyd all-pairs shortest paths.
 */
vector<vector<int>> royfloyd(const vector<vector<int>>& graph) {
    vector<vector<int>> result(graph);

    auto n = graph.size();
    for (int i = 0; i < n; ++i) {
	for (int j = 0; j < n; ++j) {
	    if (i != j && result[i][j] == 0)
		result[i][j] = numeric_limits<int>::max() / 2 - 1;
	}
    }
    
    for (auto k = 0; k < n; ++k) {
	for (auto i = 0; i < n; ++i) {
	    for (auto j = 0; j < n; ++j) {
		result[i][j] = min(result[i][j],
				   result[i][k] + result[k][j]);
	    }
	}
    }
    
    return result;
}

int main() {
    ifstream fin("royfloyd.in");
    ofstream fout("royfloyd.out");

    int n; fin >> n;
    vector<vector<int>> graph(n, vector<int>(n));
    for (int i = 0; i < n; ++i) {
	for (int j = 0; j < n; ++j) {
	    fin >> graph[i][j];
	}
    }

    auto result = royfloyd(graph);
    for (int i = 0; i < n; ++i) {
	for (int j = 0; j < n; ++j) {
	    fout << result[i][j] << " ";
	}
	fout << endl;
    }
   
    return 0;
}