Cod sursa(job #771188)

Utilizator vlad.maneaVlad Manea vlad.manea Data 25 iulie 2012 01:40:30
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <queue>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <climits>

#define INFILE "sate.in"
#define OUTFILE "sate.out"
#define NMax 32768

using namespace std;

int N, X, Y, P;
vector<int> Links[NMax], Distances[NMax];
char Line[128];

int bfs()
{
	int d, i, x, y;
	queue<int> Queue;
	vector<int> Visited(NMax, 0);
	vector<int> Distance(NMax, 0);
	
	Visited[X] = true;
	Queue.push(X);

	while (!Queue.empty())
	{
		d = Queue.front();
		
		for (i = 0; i < Links[d].size(); ++i)
		{
			x = Links[d][i];
			
			if (!Visited[x])
			{
				Distance[x] = Distance[d] + Distances[d][i];
				
				if (x == Y)
				{
					return Distance[x];
				}
				
				Visited[x] = true;
				Queue.push(x);
			}
		}

		Queue.pop();
	}
}

inline bool isDigit(char c)
{
	return '0' <= c && c <= '9';
}

void parse(int & p, int & v)
{
	v = 0;

	while (!isDigit(Line[p]))
	{
		++p;
	}

	while (isDigit(Line[p]))
	{
		v = v * 10 + Line[p] - '0';
		++p;
	}
}

int main()
{
	int x, y, d, i, M;

	freopen(INFILE, "r", stdin);
	freopen(OUTFILE, "w", stdout);

	gets(Line);

	P = 0;
	parse(P, N);
	parse(P, M);
	parse(P, X);
	parse(P, Y);

	while (M--)
	{
		gets(Line);

		P = 0;
		parse(P, x);
		parse(P, y);
		parse(P, d);

		Links[x].push_back(y);
		Links[y].push_back(x);

		Distances[x].push_back(0 + d);
		Distances[y].push_back(0 - d);
	}

	printf("%d\n", bfs());

	return 0;
}