Cod sursa(job #2843879)

Utilizator rapidu36Victor Manz rapidu36 Data 3 februarie 2022 10:03:10
Problema Algoritmul Bellman-Ford Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.32 kb
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define N 50000
#define M 250000
#define INF 1e8

typedef struct
{
    int e, urm;
} element;

typedef struct
{
    int x, y, c;
} muchie;

int lst[N+1], n, m, nr, d[N+1], q[N+1], nr_q[N+1];
bool in_q[N+1];
element v[M+1];
muchie e[M+1];

void adauga(int x, int i_e)
{//adauga pe y in lista de adiacenta a lui x
    v[++nr].e = i_e;
    v[nr].urm = lst[x];
    lst[x] = nr;
}

void initializeaza(int x0)
{
    for (int i = 1; i <= n; i++)
    {
        d[i] = INF;
    }
    d[x0] = 0;
}

bool actualizeaza()
{
    bool actual = false;
    for (int i = 1; i <= m; i++)
    {
        int x = e[i].x, y = e[i].y, c = e[i].c;
        if (d[x] + c < d[y])
        {
            d[y] = d[x] + c;
            actual = true;
        }
    }
    return actual;
}

int urmatorul(int p)
{
    p++;
    if (p == N+1)
    {
        p = 0;
    }
    return p;
}

bool bellmanford(int x0)
{
    initializeaza(x0);
    int st = 0, dr = 0;
    q[dr] = x0;
    in_q[x0] = true;
    nr_q[x0]++;
    while (urmatorul(dr) != st)
    {
        int x = q[st];
        st = urmatorul(st);
        in_q[x] = false;
        for (int p = lst[x]; p != 0; p = v[p].urm)
        {
            int y = e[v[p].e].y;
            int c = e[v[p].e].c;
            if (d[x] + c < d[y])
            {
                d[y] = d[x] + c;
                if (!in_q[y])
                {
                    dr = urmatorul(dr);
                    q[dr] = y;
                    in_q[y] = true;
                    nr_q[y]++;
                    if (nr_q[y] == n)
                    {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

int main()
{
    FILE *in, *out;
    in = fopen("bellmanford.in", "r");
    out = fopen("bellmanford.out", "w");
    fscanf(in, "%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        fscanf(in, "%d%d%d", &e[i].x, &e[i].y, &e[i].c);
        adauga(e[i].x, i);
    }
    fclose(in);
    if (!bellmanford(1))
    {
        fprintf(out, "Ciclu negativ!");
    }
    else
    {
        for (int i = 2; i <= n; i++)
        {
            fprintf(out, "%d ", d[i]);
        }
    }
    fclose(out);
    return 0;
}