Cod sursa(job #562013)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 22 martie 2011 09:41:31
Problema Algoritmul Bellman-Ford Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#define nmax 50001
#include<vector>
#define INF 250000000
using namespace std;

vector < vector < pair < int , int > > >  v(nmax);
int viz[nmax],dist[nmax],C[250100],ok1;
int N,M;

void read();
void solve();
void write();

int main()
{
	freopen ("bellmanford.in","r",stdin);
	freopen ("bellmanford.out","w",stdout);

	read();
	solve();
	write();

	return 0;
}

void read()
{
	int i,x,y;
	pair < int , int  > z;
	scanf("%d%d",&N,&M);
	for (i=1;i<=M;++i)
	{
		scanf("%d%d%d",&x,&y,&z.second);
		z.first=y;
		v[x].push_back(z);
	}
	for (i=2;i<=N;++i)
        dist[i]=INF;
}

void solve()
{
	vector < pair < int , int > > :: iterator it;
	int sf,in,x,c,p;
	C[1]=1;
	in=sf=1;
	viz[1]=1;
	while (in<=sf&&sf<=250100)
	{
	    p=C[in];
		for (it=v[p].begin();it!=v[p].end();++it)
		{
			x=(*it).first;
			c=(*it).second;
			if (dist[x]>dist[p]+c)
			{
				dist[x]=dist[p]+c;
				if (!viz[x])
				{
					++sf;
					C[sf]=x;
					viz[x]=1;
				}
			}
		}
		viz[C[in]]=0;
		++in;
	}
	if (sf>250050)
		ok1=1;
}

void write()
{
	int i;
	if (ok1)
		printf("Ciclu negativ!\n");
	else
		for (i=2;i<=N;++i)
			printf("%d ",dist[i]);
}