Pagini recente » Cod sursa (job #861491) | Istoria paginii runda/pregatire_oji_11-12/clasament | Istoria paginii runda/cnrv_4 | Istoria paginii runda/5/clasament | Cod sursa (job #3214440)
#include <iostream>
#include <fstream>
#include <vector>
/**
* Se da un graf orientat cu N noduri, memorat prin matricea ponderilor.
*
* Sa se determine pentru orice pereche de noduri x si y lungimea minima a drumului de la nodul x la nodul y si sa se afiseze matricea drumurilor minime.
* Prin lungimea unui drum intelegem suma costurilor arcelor care-l alcatuiesc.
*
* Date de intrare
* Fisierul de intrare royfloyd.in contine pe prima linie N, numarul de noduri al grafului, iar urmatoarele N linii contin cate N valori reprezentand matricea ponderilor (al j-lea numar de pe linia i+1 reprezinta costul muchiei de la i la j din graf, sau 0, in cazul in care intre cele doua noduri nu exista muchie).
*
* In fisierul de iesire royfloyd.out se vor afisa N linii a cate N valori, reprezentand matricea drumurilor minime.
* */
int main() {
std::ifstream fin("royfloyd.in");
std::ofstream fout("royfloyd.out");
int N;
fin>>N;
std::vector<std::vector<int>> M(N);
std::vector<std::vector<int>> dist(N);
for (int i = 0; i < N; ++i) {
M[i] = std::vector<int>(N);
for (int j = 0; j < N; ++j) {
fin>>M[i][j];
}
}
for (int k = 0; k < N; ++k) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if(M[i][j] > M[i][k] + M[k][j])
M[i][j] = M[i][k] + M[k][j];
}
}
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
fout<<M[i][j]<<" ";
}
fout<<'\n';
}
fin.close();
fout.close();
return 0;
}