Mai intai trebuie sa te autentifici.
Cod sursa(job #2268549)
Utilizator | Data | 24 octombrie 2018 22:37:25 | |
---|---|---|---|
Problema | PScNv | Scor | 0 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 1.56 kb |
#include <fstream>
using namespace std;
ifstream f("pscnv.in");
ofstream g("pscnv.out");
struct
{
int nod,poz_urm;
int 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;
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;
return 0;
}