Cod sursa(job #2671622)

Utilizator Edwuard99Diaconescu Vlad Edwuard99 Data 12 noiembrie 2020 14:24:18
Problema PScNv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 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;
}