Cod sursa(job #186168)

Utilizator tm_raduToma Radu tm_radu Data 26 aprilie 2008 20:15:18
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#define NM 250001
using namespace std;

int n, m;
int i, j, k, h, s, t;
int d[NM], x, y, z;
char buf[40];
struct nod {
    int vf, c;
    nod* urm;
} *l[NM];
struct lst {
    int vf;
    lst* urm;
} *cs[1001], *ct[1001];

void Add(int i, int j, int c);
void AddC(int i, int j);

int main()
{
	freopen("pscnv.in", "r", stdin);
	freopen("pscnv.out", "w", stdout);
	scanf("%d %d %d %d\n", &n, &m, &s, &t);
	for ( k = 1; k <= m; k++ )
	{
		fgets(buf, 40, stdin);  
		x = y = z = 0;  
		for (i  = 0; buf[i] >= '0' && buf[i] <= '9'; x = x * 10 + (buf[i] - '0'), ++i);  
		for (i += 1; buf[i] >= '0' && buf[i] <= '9'; y = y * 10 + (buf[i] - '0'), ++i);  
		for (i += 1; buf[i] >= '0' && buf[i] <= '9'; z = z * 10 + (buf[i] - '0'), ++i);  
		if ( x == y ) continue;
		Add(x, y, z);
	}
	for ( i = 1; i <= n; d[i] = 2000, i++ );
	d[s] = 0; AddC(0, s);
	for ( k = 0; k <= 1000; k++ )
		for ( lst* q = cs[k]; q; q = q->urm )
			if ( d[q->vf] == k )
			{
				i = q->vf;
				for ( nod* r = l[i]; r; r = r->urm )
				{
					j = d[i] > r->c ? d[i] : r->c;
					if ( d[r->vf] > j ) d[r->vf] = j, AddC(d[r->vf], r->vf);
				}
			}
	printf("%d\n", d[t]);
	return 0;
}

void Add(int i, int j, int c)
{
	nod* q = new nod;
	q->vf = j;
	q->c = c;
	q->urm = l[i];
	l[i] = q;
}

void AddC(int i, int j)
{
	lst* q = new lst;
	q->vf = j;
	q->urm = 0;
	if ( cs[i] == 0 )
		cs[i] = ct[i] = q;
	else
		ct[i]->urm = q, ct[i] = q;
}