Cod sursa(job #2478333)

Utilizator AndreiD31Dragan Andrei AndreiD31 Data 21 octombrie 2019 21:56:06
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

vector<int>v[1000010];
queue<int>q;

int t;
struct
{
    int p1,p2;
}sol[1000001];

int m,n,final1,maxim,cod_inceput,cod_final,final2,viz[1000010],lungime[1000010];
char a[1010][1010];

/*void fil(int poz1,int poz2,int minim)
{
    int cod;

   cout<<poz1<<" "<<poz2<<" "<<minim<<'\n';


    if(poz1==final1 && poz2==final2)
    {
        if(minim>maxim)maxim=minim;
    }

    if(viz[poz1+1][poz2]==0 && a[poz1+1][poz2]!='*') {cod=m*poz1+poz2; viz[poz1+1][poz2]=1; fil(poz1+1,poz2,min(minim,lungime[cod]));}

    if(viz[poz1-1][poz2]==0 && a[poz1-1][poz2]!='*') {cod=m*(poz1-2)+poz2; viz[poz1-1][poz2]=1; fil(poz1-1,poz2,min(minim,lungime[cod]));}

    if(viz[poz1][poz2+1]==0 && a[poz1][poz2+1]!='*') {cod=m*(poz1-1)+(poz2+1); viz[poz1][poz2+1]=1; fil(poz1,poz2+1,min(minim,lungime[cod]));}

    if(viz[poz1][poz2-1]==0 && a[poz1][poz2-1]!='*') {cod=m*(poz1-1)+(poz2-1); viz[poz1][poz2-1]=1; fil(poz1,poz2-1,min(minim,lungime[cod]));}
}
*/


int DFS(int nod,int minim)
{
    int vecin;

    viz[nod]=1;

    if(nod==cod_final)
    {
        return 1;
    }
    else
    {
        int ok=0;
        for(int i=0;i<v[nod].size();i++)
        {
            vecin=v[nod][i];

            if(!viz[vecin] && lungime[vecin]>=minim)
            {
                viz[vecin]=1;
                ok=max(ok,DFS(vecin,minim));
            }
        }
        return ok;
    }
}


int i,j,cod1,p,u,mij,copie,nod,vecin,cod2,inceput1,inceput2,cod;
int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            f>>a[i][j];

            cod=m*(i-1)+j;
            lungime[cod]=-1;
        }
    }

    // BORDARE
    for(i=0;i<=n+1;i++)
    {
        a[i][0]='*';
        a[i][m+1]='*';
    }
    for(j=0;j<=m+1;j++)
    {
        a[0][j]='*';
        a[n+1][j]='*';
    }


    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(a[i][j]!='*')
            {
                cod1=m*(i-1)+j;

                // Fac "matricea de adiacenta"
                if(a[i+1][j]!='*'){cod2=m*i+j; v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
                if(a[i-1][j]!='*'){cod2=m*(i-2)+j; v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
                if(a[i][j+1]!='*'){cod2=m*(i-1)+(j+1); v[cod1].push_back(cod2); v[cod2].push_back(cod1);}
                if(a[i][j-1]!='*'){cod2=m*(i-1)+(j-1); v[cod1].push_back(cod2); v[cod2].push_back(cod1);}

                // Pun in coada dragonii
                if(a[i][j]=='D'){cod2=m*(i-1)+j; q.push(cod2); lungime[cod2]=0;}

                // Verific inceputul si sfarsitul
                if(a[i][j]=='I') {inceput1=i;inceput2=j;}
                else if(a[i][j]=='O') {final1=i;final2=j;}
            }
        }
    }


    // Drumuri minime de la dragoni
    while(!q.empty())
    {
        nod=q.front();

        for(i=0;i<v[nod].size();i++)
        {
            vecin=v[nod][i];
            if(lungime[vecin]==-1)
            {
                lungime[vecin]=lungime[nod]+1;
                q.push(vecin);
            }
        }
        q.pop();
    }


    cod_inceput=m*(inceput1-1)+inceput2;
    cod_final=m*(final1-1)+final2;
     for(i=1;i<=n*m;i++)viz[i]=0;

    p=0;u=n*m;
    while(p<=u)
    {
        mij=(p+u)/2;

        for(i=1;i<=n*m;i++)viz[i]=0;

        if(DFS(cod_inceput,mij)==1){copie=mij;p=mij+1;}
        else u=mij-1;
    }

    g<<copie;

    return 0;
}