Cod sursa(job #66458)

Utilizator danielpDaniel Pasaila danielp Data 18 iunie 2007 18:55:20
Problema Sate Scor Ascuns
Compilator cpp Status done
Runda Marime 1.19 kb
#include <vector>
#include <algorithm>
#include <queue>
#include <cstdio>
using namespace std;

#define INF 999999999

#define MAXN 512
#define ABS(a) ((a) < 0 ? -(a) : (a))

int N, X, Y, D[MAXN];
vector<pair<int, int> > V[MAXN];

void read()
{
	int M;
	scanf("%d %d %d %d", &N, &M, &X, &Y), X--, Y--;

	for (int i = 0; i < M; i++)
	{
		int p, q, d;
		scanf("%d %d %d", &p, &q, &d), p--, q--;
		V[p].push_back(make_pair(q, d));
		V[q].push_back(make_pair(p, d));
	}
}

void solve()
{
	for (int i = 0; i < N; i++)
		D[i] = INF;
	D[X] = 0;
	queue<int> Q;
	Q.push(X);
	while (!Q.empty())
	{
		int nod = Q.front();
		for (int i = 0; i < V[nod].size(); i++)
			if (D[V[nod][i].first] == INF)
			{
				int v = V[nod][i].first;
				int d = V[nod][i].second;
				if (nod > X)
				{
					if (v < nod)
						D[v] = ABS(D[nod] - d);
					else
						D[v] = D[nod] + d;
				}
				else
				{
					if (v < nod)
						D[v] = ABS(D[nod] - d);
					else
						D[v] = D[nod] + d;
				}
				Q.push(v);
			}
		Q.pop();
	}

	printf("%d\n", D[Y]);
}

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

	read();
	solve();

	return 0;
}