Cod sursa(job #2267943)

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

using namespace std;

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

    return 0;
}