Cod sursa(job #862892)

Utilizator Razvan_AlexeRazvan Razvan_Alexe Data 23 ianuarie 2013 00:01:47
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <vector>
#include <queue>

#define INFINIT 999999999
#define NMAX 50010

using namespace std;

FILE * intrare = fopen("bellmanford.in","r");
FILE * iesire = fopen("bellmanford.out","w");

struct nod
{
	int ind, val, x;
};

nod nd;

int n, m;
int cmin[NMAX];
int sch;
int nr[250010];

vector<nod> v[NMAX];
queue<int>  q;

void citire();
void bmf();
void afisare();

int main()
{
    citire();

    bmf();

    afisare();

	return 0;
}

void citire()
{
    int i, x, y, cst;

	fscanf(intrare,"%d%d",&n,&m);

	for(i = 1; i <= m; i++)
	{
		fscanf(intrare,"%d%d%d",&x,&y,&cst);
		nd.ind = i;
		nd.val = cst;
		nd.x = y;
		v[x].push_back(nd);
	}

	for(i = 1; i <= n; i++)
		cmin[i] = INFINIT;

    cmin[1] = 0;
}

void bmf()
{
    int i, x;

    q.push(1);

    while(!q.empty())
    {
        x = q.front();
        q.pop();
        for(i = 0; i < int(v[x].size()); i++)
            if (cmin[x] + v[x][i].val < cmin[v[x][i].x])
            {
                cmin[v[x][i].x]= cmin[x] + v[x][i].val;
                q.push(v[x][i].x);
                nr[v[x][i].ind]++;
                if(nr[v[x][i].ind] >= n)
                {
                    sch = 1;
                    return;
                }
            }
    }
}

void afisare()
{
    int i;
	if(sch)
		fprintf(iesire,"Ciclu negativ!");
	else
		for(i = 2; i <= n; i++)
			fprintf(iesire,"%d ", cmin[i]);
    fprintf(iesire,"\n");
	fclose(iesire);
}