Cod sursa(job #402043)

Utilizator loginLogin Iustin Anca login Data 23 februarie 2010 12:55:18
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
# include <fstream>
using namespace std;
struct nod {
	int capat, cost;
	nod *next;};
nod *g[50003];
int n, m, v[50003], ap[50003], d[50003];

void add (int i, int j, int c)
{
	nod *p=new nod;
	p->capat=j;
	p->cost=c;
	p->next=g[i];
	g[i]=p;
}

void read ()
{
	ifstream fin ("bellmanford.in");
	fin>>n>>m;
	for (;m;--m)
	{
		int x, y, c;
		fin>>x>>y>>c;
		add(x, y, c);
	}
}

struct coada {
	int i;
	coada *next;};
	
int bellman ()
{
	coada *st, *dr, *q;
	st=dr=new coada;
	int k;
	st->i=1;
	st->next=NULL;
	d[1]=0;
	v[1]=1;
	while (st)
	{
		k=st->i;
		v[k]=0;
		if (d[k]<1000000000)
		for (nod *p=g[k];p;p=p->next)
			if (d[p->capat]>d[k]+p->cost)
			{
				d[p->capat]=d[k]+p->cost;
				if (v[p->capat]==0)
				{
					if (ap[p->capat]>n)
						return 1;
					q=new coada;
					q->i=p->capat;
					q->next=NULL;
					dr->next=q;
					dr=q;
					ap[p->capat]++;
					v[p->capat]=1;
				}
			}
		q=st;
		st=st->next;
		delete q;
	}
	return 0;
}

int main ()
{
	read ();
	ofstream fout ("bellmanford.out");
	for (int i=1;i<=n;i++)
		d[i]=1000000000;
	if (bellman ())
		fout<<"Ciclu negativ!";
	else
		for (int i=2;i<=n;i++)
			fout<<d[i]<<" ";
	return 0;
}