Cod sursa(job #1344)

Utilizator testTest User test Data 13 decembrie 2006 13:17:35
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <cstdio>
#include <vector>

using namespace std;

const int MAXN = 250001;

int N, M, d[MAXN], S, D;
vector<int> cst[1001];
vector< pair<int, int> > con[MAXN];

int main()
{
	freopen("pscnv.in", "rt", stdin);
	freopen("pscnv.out", "wt", stdout);
	int i, j, k;
	char s[32], *p;
	for (scanf("%d %d %d %d ", &N, &M, &S, &D); M; M--)
	{
		fgets(s, 32, stdin);
		for (i = 0, p = s; '0' <= *p && *p <= '9'; p++)
			i = i * 10 + *p - '0';
		for (j = 0, p++; '0' <= *p && *p <= '9'; p++)
			j = j * 10 + *p - '0';
		for (k = 0, p++; '0' <= *p && *p <= '9'; p++)
			k = k * 10 + *p - '0';
		con[i].push_back( make_pair(j, k) );
	}
	memset(d, 0x3f, sizeof(d));
	d[S] = 0;
	cst[0].push_back(S);
	vector< pair<int, int> > :: iterator it;
	for (i = 0; i <= 1000; i++)
		for (j = 0; j < (int)cst[i].size(); j++)
		{
			k = cst[i][j];
			if (d[k] != i) continue;
			for (it = con[k].begin(); it != con[k].end(); it++)
				if ((*it).second > i)
					if ((*it).second < d[(*it).first])
						cst[(*it).second].push_back((*it).first),
						d[(*it).first] = (*it).second;
					else;
				else
					if (i < d[(*it).first])
						cst[i].push_back((*it).first),
						d[(*it).first] = i;					
		}
	printf("%d\n", d[D]);		
	return 0;
}