Cod sursa(job #398256)

Utilizator mottyMatei-Dan Epure motty Data 18 februarie 2010 12:37:37
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<cstdio>
#include<vector>
using namespace std;

const int N=30005,M=1000001,INF=20000005;

int n,m,x,y,c[N],q[M],p,u,s[N];
bool vy;
struct xy{
	int to,c;
};

vector <xy> v[N];

void read()
{
	int j,k,l,a;
	xy aux;
	scanf("%d%d%d%d",&n,&m,&x,&y);
	while(m--)
	{
		scanf("%d%d%d",&j,&k,&l);
		if(k<j)
		{
			a=j;
			j=k;
			k=a;
		}
		aux.to=k;
		aux.c=l;
		v[j].push_back(aux);
		aux.to=j;
		aux.c=-l;
		v[k].push_back(aux);
		++s[j];
		++s[k];
	}
}

void ini()
{
	for( int i=1 ; i<=n ; ++i )
		if( i!=x )
			c[i]=INF;
}

void check(int j )
{
	if(j==y)
		vy=1;
	for( int i=0 ; i<s[j] ; ++i )
		if( c[ v[j][i].to ] > c[j]+v[j][i].c )
		{
			c[v[j][i].to]=v[j][i].c+c[j];
			q[++u]=v[j][i].to;
		}
}

void bfs()
{
	p=1;
	u=1;
	q[1]=x;
	while(p<=u&&vy==0)
	{
		check(q[p]);
		++p;
	}
}

int main()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	read();
	ini();
	bfs();
	printf("%d",c[y]);
	return 0;
}