Cod sursa(job #186161)

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

int n, m;
int i, j, k, h, s, t;
int d[NM], kmax;
struct nod {
    int vf, c;
    nod* urm;
} *l[NM];
struct lst {
    int vf;
    lst* urm;
} *cs[2001], *ct[2001];

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, &m, &s, &t);
	for ( k = 1; k <= m; k++ )
	{
		scanf("%d %d %d", &i, &j, &h);
		if ( i == j ) continue;
		Add(i, j, h);
		Add(j, i, h);
		kmax = (h > k ? h : k);
	}
	for ( i = 1; i <= n; d[i] = 2000, i++ );
	d[s] = 0; AddC(0, s);
	for ( k = 0; k <= kmax; 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;
}