Pagini recente » Cod sursa (job #1871357) | Cod sursa (job #2348222) | Cod sursa (job #1683686) | Cod sursa (job #2636463) | Cod sursa (job #3214463)
#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
/**
* 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;
constexpr int infinity = 1000000;
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);
dist[i] = std::vector<int>(N);
for (int j = 0; j < N; ++j) {
fin>>M[i][j];
dist[i][j] = M[i][j];
if(dist[i][j]==0)
dist[i][j] = infinity;//M[i][j]<=1000
}
dist[i][i]=0;
}
for (int k = 0; k < N; ++k) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if( dist[i][j] > dist[i][k] + dist[k][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if(dist[i][j]<infinity)
fout<<dist[i][j];
else
fout<<0;
fout<<" ";
}
fout<<'\n';
}
fin.close();
fout.close();
return 0;
}