Cod sursa(job #2302772)

Utilizator mihnea_toaderToader Mihnea mihnea_toader Data 15 decembrie 2018 10:04:15
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
/**
C-matrice de input
D-dinamica

D[i][j][k]=Drumul minim de la i la j folosind noduri intermediare din multimea 1...k
D[i][j][0]=C[i][j]
D[i][j][1]=min(D[i][j][0],D[i][1][0]+D[1][j][0])
D[i][j][2]=min(D[i][j][1],D[i][2][0]+D[2][j][0])

D[i][j][k]=min(D[i][j][k-1],D[i][k][k-1]+D[k][j][k-1])

--sau--
pentru eficienta in memorie

La iteratia k:
D[i][k]=Drumul minim de k la i la j folosind noduri intermediare din multimea 1...k

D[i][j]=min(D[i][j],D[i][k]+D[k][j]
*/

#include <iostream>
#include <fstream>

using namespace std;

int C[101][101], D[101][101];

int main()
{
    int n;
    ifstream fin ("royfloyd.in");
    ofstream fout ("royfloyd.out");
    fin>>n;
    for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
                {
                    fin>>D[i][j];
                    if (!D[i][j]&&i!=j)
                        D[i][j]=1<<10;
                }
    for (int k=0;k<n;k++)
        for (int i=0;i<n;i++)
            for (int j=0;j<n;j++)
                if (i!=k && j!=k)
                    D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
            fout<<D[i][j]<<" ";
        fout<<"\n";
    }
return 0;
}