Cod sursa(job #1713639)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 6 iunie 2016 03:23:19
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

#define INF 0x3f3f3f3f

using namespace std;

int Adj[105][105];
int Mat[105][105];
int N,M;

void Print(int A[105][105]){
    for(int i = 1; i <= N; ++i)
    {
        for(int j = 1; j <= N; ++j)
        {
            if(i == j)
                printf("0 ");
            else
                printf("%d ",A[i][j]);
        }
        printf("\n");
    }
}

void Mult(int A[105][105],int B[105][105])
{
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j)
            if(i != j)
                for(int k = 1; k <= N; ++k)
                    if(i != k && j != k)
                    if(A[i][j] > A[i][k] + B[k][j])
                        A[i][j] = A[i][k] + B[k][j];
}

void Read2()
{
    int a,b,c;
    scanf("%d",&N);
    for(int i = 1; i <= N; ++i)
        for(int j = 1; j <= N; ++j){
            scanf("%d",&Adj[i][j]);
            if(Adj[i][j] == 0)
                Adj[i][j] = INF;
        }
    memcpy(Mat,Adj,sizeof(Adj));
}

int main()
{
    freopen("royfloyd.in","r",stdin);
    freopen("royfloyd.out","w",stdout);

    Read2();
    //Print(Mat);
    //printf("\n---------------------------------------------\n");
    int crt = 1;
    while(crt <= N){
        crt *= 2;
        Mult(Mat,Mat);
        //Print(Mat);
        //printf("\n-----------------------------------------\n");
    }
    Print(Mat);
    return 0;
}