Cod sursa(job #2269814)

Utilizator IVVladIon Vlad Vasile IVVlad Data 26 octombrie 2018 17:14:02
Problema PScNv Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <fstream>
using namespace std;
ifstream f("pscnv.in");
ofstream g("pscnv.out");
int n,v[250001],m,start,finish,a[2][750001],st,dr,kmax=-1,kmin=100000,mid,lastmid,c[250001];
int main()
{
    f>>n>>m>>start>>finish;
    int curent=n+1;
    for(int i=1; i<=m; i++)
    {
        int x,y;
        f>>x>>y>>a[2][curent];
        if(kmax<a[2][curent]) kmax=a[2][curent];
        if(kmin>a[2][curent]) kmin=a[2][curent];
        if(v[x]==0)
            v[x]=x;
        if(v[y]==0)
            v[y]=y;
        a[1][v[x]]=curent;
        v[x]=curent;
        a[0][curent]=y;
        curent++;
    }
    for(int i=1; i<=n; i++)
        a[0][i]=i;
    bool conex=0;
    bool afisare=0;
    st=kmin;
    dr=kmax;
    while(st<=dr && afisare==0)
    {
        conex=0;
        mid=st+(dr-st)/2;
        int u=1;
        int p=1;
        c[p]=start;
        while(u>=p)
        {
            int l=c[p];
            l=a[1][l];
            while(l!=0)
            {
                if(mid>=a[2][l])
                {
                    c[++u]=a[0][l];
                    if(a[0][l]==finish)
                    {
                        conex=1;
                        lastmid=mid;
                    }
                }
                l=a[1][l];
            }
            p++;
        }
        if(conex==1)
        {
            bool conex1=0;
            u=1;
            p=1;
            c[p]=start;
            while(u>=p)
            {
                int l=c[p];
                l=a[1][l];
                while(l!=0)
                {
                    if(mid-1>=a[2][l])
                    {
                        c[++u]=a[0][l];
                        if(a[0][l]==finish)
                        {
                            conex1=1;
                            lastmid=mid;
                        }
                    }
                    l=a[1][l];
                }
                p++;
            }
            if(conex1==0)
            {
                g<<lastmid;
                afisare++;
            }
            else mid--;
        }
        if(conex==1) dr=mid;
        else st=mid+1;
    }
    return 0;
}