Cod sursa(job #2772641)

Utilizator radu.z5Zamfirescu Radu Ioan radu.z5 Data 1 septembrie 2021 22:53:41
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>

#define INF 0

using namespace std;

int **createMatrix(int l, int c) {
    int **m = new int *[l];
    for (int i = 0; i < l; i++)
        m[i] = new int[c];
    return m;
}

void freeMatrix(int **m, int l) {
    for (int i = 0; i < l; i++)
        delete[] m[i];
    delete[] m;
}

void copyMatrix(int **src, int **dest, int n) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            dest[i][j] = src[i][j];
}

void findRoads(int **w, int **roads, int n) {
    int i, j, k;
    int **d = w;

    for (k = 0; k < n; k++) {
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                if ((i ^ j) && d[i][k] != INF && d[k][j] != INF) {
                    // i si j nu sunt acelasi nod si exista drum de la i la k
                    // si de la k la j
                    if (d[i][k] + d[k][j] < d[i][j] || d[i][j] == INF)
                        d[i][j] = d[i][k] + d[k][j];
                }
            }
        }
    }
    copyMatrix(d, roads, n);
}

int main(void) {
    ifstream in("royfloyd.in");
    ofstream out("royfloyd.out");

    int N, i, j;
    in >> N;

    int **w = createMatrix(N, N);
    int **roads = createMatrix(N, N);

    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            in >> w[i][j];
            roads[i][j] = 0;
        }
    }

    findRoads(w, roads, N);

    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            out << roads[i][j] << ' ';
        }
        out << '\n';
    }

    freeMatrix(w, N);
    freeMatrix(roads, N);

    in.close();
    out.close();
    return 0;
}