Cod sursa(job #365223)

Utilizator cristiprgPrigoana Cristian cristiprg Data 18 noiembrie 2009 09:53:09
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <queue>
using namespace std;
#define DIM 30005

struct nod
{
	int capat, cost;
	nod *next;
};

int myabs(int x){ return x<0 ? -x:x;}

nod *v[DIM];
int n, m, x, y, uz[DIM], dist[DIM];
queue <int> Q;

void solve()
{
	Q.push(x);
	uz[x] = 1;
	int varf;
	nod *t;
	while (1)
	{
		varf = Q.front();
				
		t = v[ varf ];
		Q.pop();
		while (t != NULL)
		{
			if (!uz[ t -> capat])
			{
				if ((t -> capat) > varf) //daca vecinu ii in dreapta
					dist[ t->capat ] = dist[ varf ] + (t -> cost);
				else //daca vecinu ii in stanga
					dist[ t->capat ] = dist[ varf ] - (t -> cost);
				
				uz[ t -> capat ] = 1;
				Q.push(t -> capat);
				if ((t -> capat) == y)
				{
					FILE *f = fopen("sate.out", "w");
					fprintf(f, "%d\n", myabs(dist[y]));
					fclose(f);
					return;
				}
			
			
				
			}
			
			t = t->next;
			
		}
	}
	
}

int main()
{
	FILE *f = fopen("sate.in", "r");
	fscanf(f, "%d%d%d%d", &n, &m, &x, &y);
	int i, j, c;
	
	for (i = 1; i <= n; ++i)
		v[i] = NULL;
	
	nod *t;
	for (; m; --m)
	{
		fscanf(f, "%d%d%d", &i, &j, &c);
		t = new nod;
		// a[i][j]
		t -> capat = j;
		t -> cost = c;
		t -> next = v[i];
		v[i] = t;
		
		//a[j][i]
		t = new nod;
		t -> capat = i;
		t -> cost = c;
		t -> next = v[j];
		v[j] = t;
		
	}
	fclose(f);
	solve();
		
	return 0;
}