Cod sursa(job #557724)

Utilizator GeorgeGradinariuGradinariu George GeorgeGradinariu Data 16 martie 2011 20:10:46
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<vector>
#include<queue>
#include<stdio.h>
using namespace std;

#define inf INT_MAX

struct nod{int nr, val;};
vector<nod> v[50002];
queue<int>q;
int N,M,d[30002],X,p[30002],viz[30002],Y;

void citire()
{
	nod p;
	ifstream in("sate.in");
	in>>N>>M>>X>>Y;
	
	for(int i=1;i<=N;i++)
		{	
			p.nr=i;
			p.val=0;
			v[i].push_back(p);
			
		}
	int j,k,x;
	while(in>>j>>k>>x)
	{
		p.nr=k;
		p.val=x;
		v[j].push_back(p);
		p.nr=j;
		p.val=x;
		v[k].push_back(p);
	}
	in.close();
}
void af()
{
	ofstream out("bellmanford.out");
	out<<"Ciclu negativ!\n";
	out.close();
	exit (0);
}
	

void bf()
{
	int i,y;
	for(i=1;i<=N;i++)
		if(i==X)
			d[i]=0;
		else
			d[i]=inf;		

	q.push(X);
	p[X]=0;	 
	viz[X]=1;
	i=q.front();
	while(!q.empty())
	{
		i=q.front();
		q.pop();
		for(int j=0;j<(int)v[i].size();j++)
		{
			y=v[i][j].nr;
			
		if(y>i)
			if(d[i]+v[i][j].val<d[y]&&viz[y]==0)
			{
				d[y]=d[i]+v[i][j].val;
				p[y]=i;
				viz[y]++;
				q.push(v[i][j].nr);				
			}
		if(y<i)
			if(d[i]-v[i][j].val<d[y]&&viz[y]==0)
			{
				d[y]=d[i]-v[i][j].val;
				p[y]=i;
				viz[y]++;
				q.push(y);
			}
		}
		/*if ((int)q.size()>N+3)
			af();*/
		if (viz[i]>N+1)
			af();
	}	
}

int main()
{
	citire();	
	bf();
	ofstream out("sate.out");
	//for(int i=0;i<=N;i++)
	///	{for(int j=1;j<v[i].size();j++)

	//		out<<v[i][j].nr<<" "<<v[i][j].val<<" ";
	//	out<<endl;}
	//for(int i=2;i<=N;i++)
		out<<d[Y]<<" ";
	out<<'\n';
}