Cod sursa(job #2314945)

Utilizator AlexTudorAlex Brinza AlexTudor Data 9 ianuarie 2019 11:55:36
Problema Obiective Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("obiective.in");
ofstream fout("obiective.out");

const int NMAX=32005;

vector <int> Ad[NMAX],Add[NMAX],Ad2[NMAX],Add2[NMAX];
vector <vector <int> > mama;
vector <int> S,S2;
int viz[NMAX],viz2[NMAX],comp[NMAX],cost[NMAX],viz3[NMAX];
int n,m,nr,C,ct,minim;

void dfs1(int u)
{
    int w;
    viz[u]=1;
    for(int i=0;i<Ad[u].size();++i)
    {
        w=Ad[u][i];
        if(viz[w]==0) dfs1(w);
    }

    S.push_back(u);

}

void DO1()
{
    for(int i=1;i<=n;++i)
        if(viz[i]==0) dfs1(i);
}

void dfs2(int u, int nr)
{
    viz2[u]=1;
    int w;
    comp[u]=nr;
    for(int i=0;i<Add[u].size();++i)
    {
        w=Add[u][i];
        if(viz2[w]==0) dfs2(w,nr);
    }
}

void DO2()
{
    for(int i=S.size()-1;i>=0;--i)
        if(viz2[S[i]]==0)
            {
             nr++;
             dfs2(S[i],nr);
            }
}

void read()
{
    int x,y;
    fin>>n>>m;
    for(int i=1;i<=m;++i)
    {
        fin>>x>>y;
        Ad[x].push_back(y);
        Add[y].push_back(x);
    }

    DO1();
    DO2();
}

void ceva()
{
    int w;
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<Ad[i].size();++j)
        {
            w=Ad[i][j];
            if(comp[w]!=comp[i])
                {
                 Ad2[comp[i]].push_back(comp[w]);
                 Add2[comp[w]].push_back(comp[i]);
                }
        }
    }
}

void bfs(int u, int cost)
{
    if(comp[u]==C) {if(cost<minim) minim=cost;}
    else
    {
        int w;
        viz3[u]=1;
        for(int i=0;i<Ad2[u].size();++i)
            {
             w=Ad2[u][i];
             if(viz3[w]==0) bfs(w,cost);
             viz3[w]=0;
            }

        for(int i=0;i<Add2[u].size();++i)
            {
             w=Add2[u][i];
             if(viz3[w]==0) bfs(w,cost+1);
             viz3[w]=0;
            }
    }
}

void solve()
{
    int s,f,x,y;

    fin>>ct;

    for(int i=1;i<=ct;++i)
    {
        fin>>s>>f;
        C=comp[f];
        minim=1000000000;
        bfs(comp[s],0);
        fout<<minim<<"\n";
    }
}


int main()
{
    read();
    ceva();
    solve();

    return 0;
}