Cod sursa(job #862540)

Utilizator MonicaVizitiuMonica Vizitiu MonicaVizitiu Data 22 ianuarie 2013 19:21:14
Problema Algoritmul Bellman-Ford Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define INF 1000000000
using namespace std;

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

int n, start;
int cmin[50000];
int coada[250000000], prim, ultim, nrpus[50000];

void citire();
void bell();

struct varf
{
    int cost, vf;
}c[10000][10000];

int main()
{
    citire();
    bell();
    return 0;
}

void citire()
{
    int i, m, x, y, costv;
    fin>>n>>m; start=1;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>costv;
        c[x][0].vf++; c[x][c[x][0].vf].vf=y;
        c[x][0].cost++; c[x][c[x][0].cost].cost=costv;
    }
}

void bell()
{
    int i, x , ok, nr;
    int prim,ultim;
    for(i=1;i<=n;i++)
        cmin[i]=INF;
    cmin[start]=0;
	ultim=1; prim=1;
	coada[1]=start; x=start; ok=0;
	while(prim<=ultim)
	{
		x=coada[prim++];
		for(i=1;i<=c[x][0].vf;i++)
		{
			nr++;
			if(cmin[c[x][i].vf]>cmin[x]+c[x][i].cost&&c[x][i].cost!=INF)
			{
			    coada[++ultim]=c[x][i].vf;
                cmin[c[x][i].vf]=cmin[x]+c[x][i].cost;
                nrpus[c[x][i].vf]++;
            }
            if(nrpus[c[x][i].vf]>=n-1)
            {ok=1; break;}
        }
        if(ok) break;
	}
	if(ok) fout<<"Ciclu negativ!"<<'\n';
	else
        for(i=2;i<=n;i++)
            fout<<cmin[i]<<" ";
}