Cod sursa(job #325120)

Utilizator TabaraTabara Mihai Tabara Data 18 iunie 2009 23:01:21
Problema Sate Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define in "sate.in"
#define out "sate.out"
#define NMAX 30005

#define ALB 0
#define GRI 1
#define NEGRU 2

#define mod(x) ( (x) < 0 ? (-x) : (x) )

typedef struct nod {
	int vf,cost;
	struct nod *next;
} *PNOD, NOD;

PNOD L[NMAX];

int N, M, X, Y;
int sel[NMAX], q[NMAX], p, u, d[NMAX];

void Add ( int i, int j, int cost )
{
	PNOD p = (PNOD) calloc ( 1, sizeof ( NOD ) );
	p->vf = j;
	p->cost = cost;
	p->next = L[i];
	L[i] = p;
}

void BFS()
{
	q[p = u = 1] = X;
	sel[ 1 ] = GRI;
	d [ X ] = 0;

	int i; PNOD j;
	while ( p <= u )
	{
		i = q[ p ];
		for ( j = L[ i ]; j; j = j->next )
			if ( sel[ j->vf ] == ALB )
			{
				if ( j->vf > i ) d[ j->vf ] = d [ i ] + j->cost;
				else d[j->vf] = d [ i ] - j->cost;

				sel [ j->vf ] = GRI;
				q[ ++u ] = j->vf;
			}
		p++;
		sel[i] = NEGRU;
	}
}

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

	scanf ( "%d%d%d%d", &N, &M, &X, &Y );
	int i, j, di;
	for ( ; M > 0; --M )
	{
		scanf ( "%d%d%d", &i, &j, &di );
		Add ( i, j, di ); Add ( j, i, di );
	}
	BFS();
	printf ( "%d\n", d[Y] );
	return 0;
}