Cod sursa(job #3136397)

Utilizator DavidLDavid Lauran DavidL Data 6 iunie 2023 10:12:16
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("royfloyd.in");
ofstream fout("royfloyd.out");

const int NMAX = 105;
const int INF = 1000000000;

int n;
int G[NMAX][NMAX];
int dist[8][NMAX][NMAX];

void read() {
    fin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++) {
            fin >> G[i][j];
            if (G[i][j] == 0)
                G[i][j] = INF;
        }
}

void doDp() {
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            dist[0][i][j] = G[i][j];

    for (int k = 1; (1 << (k - 1)) < n; k++) {
        for (int x = 1; x <= n; x++)
            for (int y = 1; y <= n; y++) {
                dist[k][x][y] = dist[k - 1][x][y];
                for (int z = 1; z <= n; z++)
                    dist[k][x][y] = min(dist[k][x][y], (dist[k - 1][x][z] + dist[k - 1][z][y]));
            }
    }
}

int main() {
    read();
    doDp();

    int log = 0;
    while ((1 << log) < n)
        log++;
        
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j || dist[log][i][j] >= INF)
                fout << 0 << " ";
            else 
                fout << dist[log][i][j] << " ";
        }
        fout << "\n";
    }


    return 0;
}