Cod sursa(job #2314941)

Utilizator Teo_1101Mititelu Teodor Teo_1101 Data 9 ianuarie 2019 11:54:28
Problema Obiective Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

ifstream fin( "obiective.in" );
ofstream fout( "obiective.out" );
const int NMAX=32001;
int N,M,T;
int nrc;
int Cost;
int Comp[NMAX];
vector <int> Adc[NMAX];
vector <int> Adc_rev[NMAX];
vector <int> Ad[NMAX];
vector <int> Ad_rev[NMAX];
bool viz[NMAX];
vector <int> Top;
int x,y;
void Read()
{
    fin>>N>>M;
    for(int i=1; i<=N; ++i)
    {
        fin>>x>>y;
        Ad[x].push_back(y);
        Ad_rev[y].push_back(x);
    }
}
void SortTop(int x)
{
    viz[x]=1;
    for(int i=0; i<Ad[x].size(); ++i)
    {
        int w=Ad[x][i];
        if(!viz[w])SortTop(w);
    }
    Top.push_back(x);
}
void DFS(int x)
{
    viz[x]=1;
    Comp[x]=nrc;
    for(int i=0; i<Ad_rev[x].size(); ++i)
    {
        int w=Ad_rev[x][i];
        if(!viz[w])DFS(w);
    }
}
void DFS2(int nod,int Cost)
{
    viz[nod]=1;
    if(Comp[y]==nod){fout<<Cost<<"\n";return;}
    for(int i=0;i<Adc[nod].size();++i)
        if(viz[Adc[nod][i]]==0)
            DFS2(Adc[nod][i],Cost);
    for(int i=0;i<Adc_rev[nod].size();++i)
        if(viz[Adc_rev[nod][i]]==0)
            DFS2(Adc_rev[nod][i],Cost+1);
}
void Query()
{
    Cost=0;
    if(Comp[x]==Comp[y])fout<<Cost<<"\n";
    else
    {
        DFS2(Comp[x],Cost);
        //fout<<Cost<<"\n";
    }

}
void Solve()
{
    for(int i=1; i<=N; ++i)
        if(!viz[i])SortTop(i);
    for(int i=1; i<=N; ++i)viz[i]=0;
    for(int i=Top.size()-1; i>=0; --i)
    {
        if(viz[Top[i]]==0)
        {
            nrc++;
            DFS(Top[i]);
        }
    }
    //for(int i=1;i<=N;++i)fout<<Comp[i]<<" ";
    for(int i=1; i<=N; ++i)
    {
        for(int j=0; j<Ad[i].size(); ++j)if(Comp[i]!=Comp[Ad[i][j]])
            {
                Adc[Comp[i]].push_back(Comp[Ad[i][j]]);
                Adc_rev[Comp[Ad[i][j]]].push_back(Comp[i]);
            }
    }
    //for(int i=1;i<=nrc;++i){fout<<i<<" ";for(int j=0;j<Adc[i].size();++j)fout<<Adc[i][j]<<" ";fout<<"\n";}
    fin>>T;
    for(int t=1; t<=T; ++t)
    {
        fin>>x>>y;
        for(int i=1; i<=nrc; ++i)viz[i]=0;
        Query();
    }
}
int main()
{
    Read();
    Solve();
    return 0;
}