Cod sursa(job #2596390)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 9 aprilie 2020 18:02:14
Problema Floyd-Warshall/Roy-Floyd Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define Dim 101
#define oo 2e9
using namespace std;
ifstream f("royfloyd.in");
ofstream g("royfloyd.out");
int N,A[2][Dim][Dim],T[Dim][Dim][Dim];


int main()
{
    f>>N;
    for(int i=1;i<=N;i++)
    for(int j=1;j<=N;j++)
    {
        f>>A[0][i][j];

        if(i!=j && A[0][i][j]==0) A[0][i][j]=oo;

        if(i==j||A[0][i][j]==oo) T[0][i][j]=-1;
        else
        if(i!=j || A[0][i][j]<oo ) T[0][i][j]=i;
    }

    for(int k=1;k<=N;k++)
    for(int i=1;i<=N;i++)
    for(int j=1;j<=N;j++)
    if( i != j )
    {
        if( A[!(k%2)][i][j] <= A[!(k%2)][i][k]+A[!(k%2)][k][j] )
        {
            A[k%2][i][j]=A[!(k%2)][i][j];
            T[k][i][j]=T[k-1][i][j];
        }
        else
        {
            A[k%2][i][j]=A[!(k%2)][i][k]+A[!(k%2)][k][j];
            T[k][i][j]=T[k-1][k][j];
        }
    }

    //cout<<"Matricea drumurilor minime intre oricare doua perechi de varfuri este: "<<'\n';
    for(int i=1;i<=N;i++,g<<'\n')
    for(int j=1;j<=N;j++) g<<A[N%2][i][j]<<' ';


    return 0;
}