Cod sursa(job #3136399)

Utilizator DavidLDavid Lauran DavidL Data 6 iunie 2023 10:18:47
Problema Algoritmul Bellman-Ford Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("royfloyd.in");
ofstream fout("royfloyd.out");

const int NMAX = 1005;
const int INF = 1000000000;

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

void read() {
    fin >> n >> m;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            G[i][j] = INF;

    for (int i = 1; i <= m; i++) {
        int u, v, c;
        fin >> u >> v >> c;
        G[u][v] = min(G[u][v], c);
    }
}

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++)
        if (dist[log][i][i] < 0) {
            fout << "Ciclu negativ!";
            return 0;
        }
        
    for (int j = 2; j <= n; j++) {
        if (dist[log][1][j] >= INF)
            fout << 0 << " ";
         else 
            fout << dist[log][1][j] << " ";
    }


    return 0;
}