Cod sursa(job #170129)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 2 aprilie 2008 13:54:00
Problema PScNv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>

int n, m, sursa, dest, ok, max, min = 1001, ok2;

int *v[250006], *cost[250006];

void citire()
{
	freopen("pscnv.in","r",stdin);
	freopen("pscnv.out","w",stdout);

	int i, a, b, c, j;
	char s[50];
	scanf("%d %d %d %d\n",&n,&m,&sursa,&dest);

	for (i=1;i<=n;++i)
	{
		v[i] = (int*)realloc(v[i],sizeof(int));
		v[i][0] = 0;
		cost[i] = (int*)realloc(cost[i],sizeof(int));
		cost[i][0] = 0;
	}

	for (i=1;i<=m;++i)
	{		
		fgets(s,50,stdin);
		j = a = b = c = 0;
		while (s[j] <= '9' && s[j] >= '0') {a = a * 10 + s[j] - '0'; j++;}
		j++;
		while (s[j] <= '9' && s[j] >= '0') {b = b * 10 + s[j] - '0'; j++;}
		j++;
		while (s[j] <= '9' && s[j] >= '0') {c = c * 10 + s[j] - '0'; j++;}

		++v[a][0]; v[a] = (int*)realloc(v[a],(v[a][0]+1)*sizeof(int));
		v[a][v[a][0]] = b;
		++cost[a][0]; cost[a] = (int*)realloc(cost[a],(cost[a][0]+1)*sizeof(int));
		cost[a][cost[a][0]] = c;		

		if (c > max) max = c;
		if (c < min) min = c;
	}
}


void BF(int d)
{
	int p , u, c[250005], i;
	p = u = 1;
	c[1] = sursa;
	while (p <= u)
	{
		if (ok && ok2) return;
		for (i = 1; i <= v[c[p]][0]; i++)
			if (cost[c[p]][i] <= d)
			{
				if (cost[c[p]][i] == d) ok2 = 1;
				if (v[c[p]][i] == dest) { ok = 1; return; }
				c[++u] = v[c[p]][i];
			}
		p++;
	}
}


int caut()
{
	int p = min, u = max, m;
	m = (p + u) / 2;

	while (p <= u)
	{
		ok = ok2 = 0;
		BF(m);
		if (ok)
		{
			if (ok2) return m;
			else u = m - 1;
		}
		else p = m + 1;
		m = (p + u) / 2;
	}
	return 0;
}

int main()
{
	citire();
	printf("%d\n",caut());
	return 0;
}