Cod sursa(job #129159)

Utilizator pishtymatei silviu pishty Data 28 ianuarie 2008 18:20:53
Problema PScNv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
using namespace std;
#include<cstdio>
#include<list>
#define Nm 250001
#define Km 1001
#define max(a,b) ((a)>(b)?(a):(b))
list< pair<int,int> > G[Nm];
list<int> L[Km];
int Dm[Nm],n,x0,y0;

void read()
{
    char S[19];
    int m,x,y,k,i;
    pair<int,int> p;

    freopen("pscnv.in","r",stdin);
    scanf("%d%d%d%d\n",&n,&m,&x0,&y0);
    while(m--)
    {
        gets(S);
        x=y=k=0;
        for(i=0;S[i]!=' ';++i)
            x=x*10+S[i]-'0';
        for(++i;S[i]!=' ';++i)
            y=y*10+S[i]-'0';
        for(++i;S[i];++i)
            k=k*10+S[i]-'0';
        p.first=y;
        p.second=k;
        G[x].push_back(p);
    }
}

void solve()
{
    int i,x,d;
    list< pair<int,int> >::iterator it;

    for(i=1;i<=n;++i)
        Dm[i]=Km;
    Dm[x0]=0;
    L[0].push_back(x0);
    
    i=0;
    while(1)
    {
        if(L[i].empty())
        {
            ++i;
            continue;
        }
        x=L[i].front();
        if(x==y0)
            break;
        if(Dm[x]<i)
        {
            L[i].pop_front();
            continue;
        }

        for(it=G[x].begin();it!=G[x].end();++it)
        {
            d=max(i,(*it).second);
            if(d<Dm[(*it).first])
            {
                Dm[(*it).first]=d;
                L[d].push_back((*it).first);
            }
        }
        L[i].pop_front();
    }
}

void write()
{
    freopen("pscnv.out","w",stdout);
    printf("%d\n",Dm[y0]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}