Cod sursa(job #1713638)

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

#define INF 0x3f3f3f3f

using namespace std;

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

void Print(int A[100][100]){
    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[100][100],int B[100][100])
{
    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));
}

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

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

    Read2();
    //Print(Mat);
    //printf("\n---------------------------------------------\n");
    for(int i = 1; i <= N; ++i)
    {
        Mult(Mat,Adj);
        //Print(Mat);
        //printf("\n-----------------------------------------\n");
    }
    Print(Mat);
    return 0;
}