Cod sursa(job #178)

Utilizator MariusMarius Stroe Marius Data 6 decembrie 2006 00:06:06
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
using namespace std;

const char iname[] = "pscnv.in";
const char oname[] = "pscnv.out";

#define MAX_N   250001
#define MAX_K   1001
#define MAX_BUF 32

#define MAX(z, w) ((z) > (w) ? (z) : (w))
#define isnum(z)  ('0' <= (z) && (z) <= '9')

struct NodArb
{
	int vrf;
	int cst;
	NodArb * next;
} * A[MAX_N];

struct NodLst
{
	int vrf;
	NodLst * next;
} * beg[MAX_K], * end[MAX_K];

int V[MAX_N];	/* valoarea muchiei de cost maxim */


void add(int vrf, int k)
{
	NodLst * p = new NodLst;

	p -> vrf = vrf, p -> next = NULL;

	if (beg[k] == NULL)
		beg[k] = end[k] = p;
	else
		end[k] -> next = p, end[k] = p;
}

int solve(int N, int srs, int dst)
{
	int i;

	for (i = 1; i <= N; ++i)
		V[i] = MAX_K;

	add(srs, V[srs] = 0);

	for (i = 0; i < MAX_K; ++i) {
		for (NodLst * p = beg[i]; p; p = p -> next) {
			if (V[p -> vrf] < i)
				continue;
			else
				for (NodArb * q = A[p -> vrf]; q; q = q -> next)
					if (V[q -> vrf] > MAX(i, q -> cst)) {
						V[q -> vrf] = MAX(i, q -> cst);
						add(q -> vrf, V[q -> vrf]);
					}
		}
	}

	return V[dst];
}

int main(void)
{
	int N, M, X, Y;
	int i, k;
	int x, y, z;

	NodArb * p;

	freopen(iname, "r", stdin);

	char buffer[MAX_BUF];

	for (scanf("%d %d %d %d\n", &N, &M, &X, &Y), i = 0; i < M; ++i) {
		fgets(buffer, MAX_BUF, stdin);
		x = y = z = 0;
		for (k  = 0; isnum(buffer[k]); x = x * 10 + (buffer[k] - '0'), ++k) ;
		for (k += 1; isnum(buffer[k]); y = y * 10 + (buffer[k] - '0'), ++k) ;
		for (k += 1; isnum(buffer[k]); z = z * 10 + (buffer[k] - '0'), ++k) ;
		p = new NodArb;
		p -> vrf = y, p -> cst = z, p -> next = A[x], A[x] = p;
	}
	freopen(oname, "w", stdout);
	
	printf("%d\n", solve(N, X, Y));

	return 0;
}