Cod sursa(job #3198981)

Utilizator bia_alxAlexandru Bianca bia_alx Data 31 ianuarie 2024 11:45:18
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 50002
#define INF 1000000000

using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");

struct arc {int vf, c; }; ///extr finala a arcului si costul sau
vector<arc> g[NMAX];
int n, m, start=1;
int cmin[NMAX], nr[NMAX];
bool circuitneg=0;

queue<int> C;

int main()
{int i, x, y, cost;
 arc a;
    ///citirea
    fin >> n >> m;
    for(i=0; i<m; i++)
        {
          fin >> x >> y >> cost; ///exista arc de la x la y de cost c
          a.vf=y; a.c=cost;
          ///inserez arcu a in lista de adiacenta a lui x
          g[x].push_back(a);
        }

    ///initializare
    for(i=1; i<=n; i++)
        cmin[i]=INF;
    cmin[start]=0;
    C.push(start);
    while(!C.empty() && !circuitneg)
         {
           x=C.front(); C.pop();
           ///parcurg lista de adiacenta a lui x
           for(i=0; i<g[x].size(); i++)
               {
                 y=g[x][i].vf;
                 cost=g[x][i].c;
                 if(cmin[y]>cmin[x]+cost)
                    {
                      cmin[y]=cmin[x]+cost;
                      nr[y]++;
                      if(nr[y]==n) circuitneg=1;
                         else C.push(y);
                    }
               }
         }

    ///afisarea
    if(circuitneg)
        fout << "Circuit negativ!";
        else
          {
            for(i=2; i<=n; i++)
                fout << cmin[i] << ' ';
          }

    return 0;
}