Cod sursa(job #1834053)

Utilizator radu102Radu Nicolau radu102 Data 23 decembrie 2016 19:44:57
Problema Algoritmul Bellman-Ford Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>
//#include <time.h>
 
using namespace std;
 
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
 
struct muchie
{
    int y;
    int c;
};
 
struct nod
{
    vector <muchie> v;
    int nrp;
    int dist;
};
 
nod g[50001];
 
int n, m;
 
queue <int> q;
 
int main()
{
    fin >> n >> m;
    
    for(int i=0;i<n;i++)
    {
        g[i].nrp = 0;
        g[i].dist = 250000010;
    }

    for(int i=1; i<=m; i++)
    {
        int x, y, c;
        muchie m0;
 
        fin >> x >> y >> c;
 
        m0.y=y;
        m0.c=c;
 
        g[x].v.push_back(m0);
    }
 
    //clock_t start = clock();
    g[1].dist=0;
    q.push(1);
 
    while(!q.empty())
    {
        int ct=q.front();
        q.pop();
 
        g[ct].nrp++;

        //daca avem un ciclu negativ nu putem rezolva problema
        if(g[ct].nrp>m)
        {
            fout << "Ciclu negativ!";
            return 0;
        }
 
        for(unsigned int i=0; i<g[ct].v.size(); i++)
        {
            if(g[ct].dist+g[ct].v[i].c < g[g[ct].v[i].y].dist)
            {
                g[g[ct].v[i].y].dist = g[ct].dist+g[ct].v[i].c;

                /*Incarcam pe o stiva fiecare nod catre care am schimbat costul minim.
                  Daca am schimba costurile fiecarui nod, ar trebui sa vizitam muchiile fiecarui nod,
                  de N -1 ori. De aici avem complexitatea temporala min cel mai rau caz de O(|V| * |E|),
                  unde V sunt nodurile si E sunt muchiile, pentru fiecare nod*/
                q.push(g[ct].v[i].y);

            }
        }
    }
    //clock_t end = clock();
    //printf("Duratie: %.2fs\n", (double)(end - start)/CLOCKS_PER_SEC);

    for(int i=2; i<=n; i++)
    {
        fout << g[i].dist << " ";
    }
 
    return 0;
}