Cod sursa(job #2704794)

Utilizator armigheGheorghe Liviu Armand armighe Data 11 februarie 2021 11:48:49
Problema Obiective Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;
ifstream f("obiective.in");
ofstream g("obiective.out");
vector<int>a[32002],inv[32002],ctc[32002],arb[32002];
int n,k,kk[32002],ktk[32002],gr[32002],niv[32002];
bool viz[32002];

void dfs(int x)
{
    viz[x]=1;
    for(auto y:a[x])
    if(viz[y]==0)
        dfs(y);
    kk[++k]=x;
}

void dfs_inv(int x)
{
    viz[x]=1;
    ctc[k].push_back(x);
    ktk[x]=k;
    for(auto y:inv[x])
    if(viz[y]==0)
        dfs_inv(y);
}

void kosaraju()
{
    int i;
    for(i=1;i<=n;i++)
    if(viz[i]==0)
        dfs(i);
    for(i=1;i<=n;i++)
        viz[i]=0;
    k=0;
    for(i=n;i>=1;i--)
    if(viz[kk[i]]==0)
    {
        k++;
        dfs_inv(kk[i]);
    }
}

void dfs_arbore(int x)
{
    for(auto y:arb[x])
    if(niv[y]==0)
    {
        niv[y]=niv[x]+1;
        dfs_arbore(y);
    }
}

int main()
{
    int m,i,x,y,root,t;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        a[x].push_back(y);
        inv[y].push_back(x);
    }
    kosaraju();
    for(i=1;i<=k;i++)
    for(auto x:ctc[i])
    for(auto y:a[x])
    if(ktk[x]!=ktk[y])
        arb[ktk[x]].push_back(ktk[y]),gr[ktk[y]]++;
    for(i=1;i<=k;i++)
    if(gr[i]==0)
    {
        root=i;
        break;
    }
    niv[root]=1;
    dfs_arbore(root);
    f>>t;
    for(i=1;i<=t;i++)
    {
        f>>x>>y;
        x=ktk[x];
        y=ktk[y];
        g<<max(niv[x]-niv[y],0)<<'\n';
    }
    return 0;
}