Cod sursa(job #2268596)

Utilizator alex.carpCarp Alexandru alex.carp Data 24 octombrie 2018 23:52:42
Problema PScNv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <fstream>

using namespace std;

ifstream f("pscnv.in");
ofstream g("pscnv.out");
struct
{
    unsigned nod,poz_urm;
    unsigned cost;
} v[750002];
unsigned t,n,m,x,y,q[750002];
void adarc(unsigned a,unsigned b,unsigned c)
{
    unsigned ultim_poz[250002],crt;
    bool ok;
    if(v[a].poz_urm==0)
    {
        v[a].poz_urm=t;
        v[t].nod=b;
        v[t].cost=c;
        ultim_poz[a]=t;
        t++;
    }
    else
    {
        ok=0;
        crt=v[a].poz_urm;
        while(crt!=0)
        {
            if(v[crt].nod==b && v[crt].cost>c)
            {
                v[crt].cost=c;
                ok=1;
                break;
            }
            crt=v[crt].poz_urm;
        }
        if(ok==0)
        {
            v[ultim_poz[a]].poz_urm=t;
            v[t].nod=b;
            v[t].cost=c;
            ultim_poz[a]=t;
            t++;
        }
    }
}
int parcurgere(unsigned k)
{
    unsigned prim,ultim,crt;
    bool vizitat[250002];
    for(unsigned i=1; i<=n; i++)vizitat[i]=0;
    prim=1;
    ultim=1;
    q[prim]=x;
    vizitat[x]=1;
    while(prim<=ultim)
    {
        crt=v[q[prim]].poz_urm;
        while(crt!=0)
        {
            if(vizitat[v[crt].nod]==0 && v[crt].cost<=k)
            {
                vizitat[v[crt].nod]=1;
                if(v[crt].nod==y)return 1;
                ultim++;
                q[ultim]=v[crt].nod;
            }
            crt=v[crt].poz_urm;
        }
        prim++;
    }
    return 0;
}
int main()
{
    f>>n>>m>>x>>y;
    unsigned i,a,b,c,kmin,st,dr,mij;
    for(t=1; t<=n; t++)
        v[t].nod=t;
    for(i=1; i<=m; i++)
    {
        f>>a>>b>>c;
        if(a!=b)adarc(a,b,c);
    }
    st=1;
    dr=1000;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(parcurgere(mij)==1)
        {
            kmin=mij;
            dr=mij-1;
        }
        else st=mij+1;
    }
    g<<kmin<<'\n';

    return 0;
}