Cod sursa(job #256818)

Utilizator ada_sAda-Mihaela Solcan ada_s Data 12 februarie 2009 11:28:45
Problema Sate Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>
#include <string.h>

const int NMAX=2300;

long c[NMAX][NMAX], m, tc, dist[NMAX];
int x[NMAX], y[NMAX], n, ax, ay, cont[NMAX], q[NMAX], *a[NMAX];

long bf(int x, int y);

int main()
{
	long i;
	freopen("sate.in", "r", stdin);
	freopen("sate.out", "w", stdout);
	scanf("%d%ld%d%d", &n, &m, &ax, &ay);
	for (i=0; i<m; i++)
	{
		scanf("%d%d%ld", &x[i], &y[i], &tc);
		if (x[i]<y[i])
		{
			c[x[i]][y[i]]=tc;
			c[y[i]][x[i]]=-tc;
		}//if
		else
		{
			c[x[i]][y[i]]=-tc;
			c[y[i]][x[i]]=tc;			
		}//else
		cont[x[i]]++;
		cont[y[i]]++;
	}//for i
	for (i=1; i<=n; i++)
	{
		a[i]=new int[cont[i]+1];
		a[i][0]=0;
	}//for i
	for (i=0; i<m; i++)
	{
		a[x[i]][++a[x[i]][0]]=y[i];
		a[y[i]][++a[y[i]][0]]=x[i];
	}//for i
	printf("%ld", bf(ax, ay));
	return 0;
}//main

long bf(int x, int y)
{
	int u=0, p=0, i, t, t1;
	memset(dist, -1, sizeof(dist));
	q[u]=x;
	dist[x]=0;
	while (p<=u)
	{
		t=q[p++];
		for (i=1; i<=a[t][0]; i++)
		{
			t1=a[t][i];
			if (dist[t1]<0)
			{
				dist[t1]=dist[t]+c[t][t1];
				q[++u]=t1;
				if (t1==y)
					return dist[y];
			}//if				
		}//for i
	}//while
	return -1;
}//bf